首页 文章

修改由EF5 Code First创建的多对多表

提问于
浏览
2

我有2个类,一个是另一个的集合属性,如下所示 .

public class NotificationMessage
{
    public int ID { get; set; }
    public string Message { get; set; }
    public virtual ICollection<Device> Devices { get; set; }
}

public class Device
{
    public int ID  { get; set; }
    public string Token  { get; set; }
    public virtual ICollection<NotificationMessage> NotificationMessages { get; set; }
}

public class NotificationMessageDevice
{
    [Column(Order = 0), Key, ForeignKey("NotificationMessage")]
    public int NotificationMessageID { get; set; }

    [Column(Order = 1), Key, ForeignKey("Device")]
    public int DeviceID { get; set; }


    public virtual Device Device { get; set; }
    public virtual NotificationMessage NotificationMessage { get; set; }
}

当您创建上述关系时,实体flamework足以通过创建NotificationMessageDevices在Database上创建多对多关系 .

问题在这里上升 . 现在我想将CreateDate添加到表'NotificationMessageDevices'中 . 我所做的是我创建了一个名为'NotificationMessageDevice'的新类,实体框架将在现有数据库中创建表“NotificationMessageDevices” . 我添加了新属性并调用了Update-Verbose . 第一个例外是关于缺少ID属性它希望我添加public int ID {get; set;}但是当我添加它时它意识到ID属性是index属性,所以我需要删除该表中的所有数据 .

这个案例在没有数据丢失的实体框架上的解决方法是什么:)

1 回答

  • 1

    您可以像这样创建链接实体:

    public class DeviceNotificationMessages
    {
        public DeviceNotificationMessages()
        {
            CreateDate = DateTimeOffset.Now;
        }
    
        [Column(Order = 0), Key, ForeignKey("NotificationMessage")]
        public int NotificationMessageId { get; set; }
        public virtual NotificationMessage NotificationMessage { get; set; }
        [Column(Order = 1), Key, ForeignKey("Device")]
        public int DeviceID { get; set; }
        public virtual Device Device { get; set; }
    
        public DateTimeOffset CreateDate { get; set; }
    }
    

    然后,您需要自己处理迁移到此新实体以避免数据丢失 . 如果您使用的是代码优先迁移,则需要添加手动迁移(自动迁移会导致数据丢失),然后编辑脚本以便不删除数据 .

相关问题