【问题标题】:Having trouble with EF code first and mvc 3.0 relationshipsEF 代码优先和 mvc 3.0 关系有问题
【发布时间】:2012-11-05 05:21:53
【问题描述】:

运行我的应用程序时出现以下错误。我正在强制应用程序为我的上下文执行 DropCreateDatabaseAlways,所以我不确定为什么它会说我正在尝试使用相同的键插入多个实体。

用户和消息的链接方式可能存在问题。我必须补充:

                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="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();
            }

【问题讨论】:

    标签: asp.net-mvc-3 ef-code-first many-to-many datacontext circular-reference


    【解决方案1】:

    为了让它发挥作用,改变两件事。 首先删除 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);
    

    【讨论】:

    • 感谢 Wim 的回复。只是想在这里学习,你能解释一下我做错了什么吗?或者为什么它不起作用?
    • 主要是您的用户实体不完整。您只定义了 MessagesReceived。如果没有 MessagesSend,第二个映射很难正确。错误是由未定义为 foreignKey 的 UserSendFromId 引发的。
    • 它总是帮助我在数据库中创建数据模型并使用blogs.msdn.com/b/adonet/archive/2012/04/09/…对实体和映射进行逆向工程
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2013-01-07
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多