1

運行我的應用程序時出現以下錯誤。我迫使應用程序爲我的上下文執行DropCreateDatabaseAlways,所以我不知道爲什麼它會說我試圖用同一個鍵插入多個實體。首先遇到與EF代碼和mvc 3.0關係有關的問題

用戶和消息的鏈接方式可能存在問題。我不得不補充:

   modelBuilder.Entity<Message>() 
        .HasRequired(m => m.UserSentFrom) 
        .WithRequiredDependent() 
        .WillCascadeOnDelete(false); 

只是因爲我得到關於循環引用的警告,並且必須將willcascadeondelete設置爲false。

如果有什麼問題我的設計,讓我知道,但是這是我想要做的事: 用戶有很多消息, 消息有一個FROMUSER 消息有很多ToUsers

任何幫助將不勝感激,因爲這讓我瘋狂。

{「衝突的變化來檢測。試圖插入多個實體使用相同的密鑰時,可能發生這種情況。」}

public class User 
     { 
      public int Id { get; set; } 
      [Required(ErrorMessage="Username is required")] 
      public string Username { get; set; } 
      [Required(ErrorMessage = "Password is required")] 
      [DataType(DataType.Password)] 
      public string Password { get; set; } 
      [Required(ErrorMessage="Email Address is required")] 
      [DataType(DataType.EmailAddress)] 
      public string UserEmailAddress { get; set; } 
      [DisplayFormat(DataFormatString="{0:d}",ApplyFormatInEditMode=true)] 
      public DateTime DateCreated { get; set; } 
      [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] 
      public DateTime LastUpdated { get; set; } 
      public virtual ICollection<Message> Messages { get; set; } 
      public User() 
      { 
       Messages = new List<Message>(); 
      } 
     } 

    public class Message 
     { 
      public int Id { get; set; } 
      public DateTime DateSent { get; set; } 
      public virtual ICollection<User> UserSentTo { get; set; } 
      public string Title { get; set; } 
      public string Body { get; set; } 
      public int UserSentFromId { get; set; } 
      public virtual User UserSentFrom { get; set; } 
     } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
      { 
       modelBuilder.Entity<Message>() 
        .HasMany(m => m.UserSentTo).WithMany(u => u.Messages) 
        .Map(t => t.MapLeftKey("MessageId") 
         .MapRightKey("UserId") 
         .ToTable("MessagesUserSentTo")); 
       modelBuilder.Entity<Message>() 
        .HasRequired(m => m.UserSentFrom) 
        .WithRequiredDependent() 
        .WillCascadeOnDelete(false); 
      } 

    protected override void Seed(WebsiteGameContext context) 
      { 
       var users = new List<User> 
       { 
        new User { Username = "Admin", UserEmailAddress="[email protected]", DateCreated = DateTime.Now, LastUpdated = DateTime.Now}, 
        new User { Username = "Member", UserEmailAddress="[email protected]",DateCreated = DateTime.Now, LastUpdated = DateTime.Now} 
       }; 
       users.ForEach(u => context.Users.Add(u)); 
       context.SaveChanges(); 

       var messages = new List<Message> 
       { 
        new Message { DateSent=DateTime.Now, Title="Sent From Admin", Body="There should be 2 users that this was sent to", UserSentFromId=users[0].Id,UserSentTo= new List<User>()}, 
        new Message { DateSent=DateTime.Now, Title="Sent From Member", Body="There should be 1 user that this was sent to", UserSentFromId=users[1].Id,UserSentTo= new List<User>()} 
       }; 
       messages.ForEach(m => context.Messages.Add(m)); 
       context.SaveChanges(); 

       messages[0].UserSentTo.Add(users[0]); 
       messages[0].UserSentTo.Add(users[1]); 
       messages[1].UserSentTo.Add(users[0]); 
       context.SaveChanges(); 
      } 

回答

0

爲了使工作變兩件事情。 首先刪除Users中的messages屬性並創建一個MessagesSend和MessagesReceived屬性。然後製作像這樣的映射:

 modelBuilder.Entity<Message>().HasMany(t => t.UserSentTo) 
      .WithMany(t => t.MessagesReceived) 
      .Map(m => 
      { 
       m.ToTable("MessagesUserSentTo"); 
       m.MapLeftKey("MessageId"); 
       m.MapRightKey("UserId"); 
      }); 

     modelBuilder.Entity<Message>().HasRequired(t => t.UserSentFrom) 
      .WithMany(t => t.MessagesSend) 
      .HasForeignKey(d => d.UserSentFromId) 
      .WillCascadeOnDelete(false); 
+0

感謝您的回覆Wim。試圖在這裏學習,你能解釋一下我做錯了什麼嗎?或爲什麼它不工作? – SOfanatic

+0

最主要的是你的用戶實體不完整。您只定義了MessagesReceived。沒有消息發送第二個映射很難得到正確的。該錯誤是由未被定義爲foreignKey的UserSendFromId拋出的。 – Wim

+0

它始終幫助我在數據庫中創建數據模型,並通過http://blogs.msdn.com/b/adonet/archive/2012/04/09/ef-power-tools-beta- 2- available.aspx – Wim