1

응용 프로그램을 실행할 때 다음 오류가 발생합니다. 내 문맥에 대해 DropCreateDatabaseAlways 할 응용 프로그램을 강제로 해요 그래서 같은 키를 여러 엔터티를 삽입하려면 노력하고있어 말할 것이라고 확신하지 않습니다.EF 코드 첫 번째 및 mvc 3.0 관계에 문제가 발생했습니다.

사용자와 메시지의 연결 방법에 문제가있을 수 있습니다. 나는 다음을 추가해야만했다 :

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

나는 순환 참조에 대한 경고를 받고 있었기 때문에 willcascadeondelete를 false로 설정해야했다. 내 디자인에 문제가있을 경우

알려, 그러나 이것은 내가 할 노력하고있어입니다 : 메시지는 하나 FromUser 메시지가 많은에게 연계

어떤 도움을 보유하고 있으며, 사용자가 많은 메시지가 이것이 나를 미치게 만들면 감사하겠습니다.

{ "같은 키를 사용하여 여러 개체를 삽입 할 때 충돌 변경.이 발생할 수 있습니다 발견했습니다."}

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

이 변화 2 가지를 작동하려면. 먼저 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 만 정의했습니다. MessageSend를 사용하지 않으면 두 번째 매핑이 제대로 이루어지지 않습니다. foreignKey로 정의되지 않은 UserSendFromId에 의해 오류가 발생했습니다. – Wim

+0

항상 데이터베이스에서 데이터 모델을 만들고 http://blogs.msdn.com/b/adonet/archive/2012/04/09/ef-power-tools-beta-data/ko-kr/ko-kr/ko/에서 엔티티와 매핑을 리버스 엔지니어링하는 데 도움이됩니다. 2-available.aspx – Wim