1

アプリケーションの実行中に次のエラーが発生します。コンテキストに対してアプリケーションに DropCreateDatabaseAlways を強制的に実行させているため、同じキーで複数のエンティティを挿入しようとしていると言う理由がわかりません。

User と Message のリンク方法に問題がある可能性があります。追加する必要がありました:

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

循環参照に関する警告が表示され、willcascadeondelete を false に設定する必要があったからです。

私のデザインに何か問題がある場合はお知らせください。しかし、これは私がやろうとしていることです: User has many Messages, Message has one FromUser Message has many 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="admin@temp.com", DateCreated = DateTime.Now, LastUpdated = DateTime.Now},
                    new User { Username = "Member", UserEmailAddress="member@temp.com",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();
            }
4

1 に答える 1

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);
于 2012-11-05T09:47:01.517 に答える