微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 实体框架 – 代码优先方法

我只是在我的项目中遵循实体框架代码的第一种方法,我遇到了一些问题.总是我被迫使用命令重新生成数据库.然而,现在我成功地保持稳定.我有一个场景,在这个,框架创建一个迁移脚本是不合逻辑的,可能是我错过了一些东西,需要你的帮助

场景是 – 我启用了迁移,并且它创建了一个包含所有表格设置的InitialCreate类,我对此印象非常深刻.但是当我在实体中进行更改时,例如,我有Deal Class

添加了名为LenderName,BorrowerName的新属性,并运行了添加迁移脚本,它为我创建了一个迁移脚本,

public partial class LenderBorrowerName : DbMigration
    {
        public override void Up()
        {
            DropColumn("dbo.Deals","LenderName");
            DropColumn("dbo.Deals","BorrowerName");
            DropColumn("dbo.Deals","discriminator");
        }

        public override void Down()
        {
            AddColumn("dbo.Deals","discriminator",c => c.String(nullable: false,maxLength: 128));
            AddColumn("dbo.Deals","BorrowerName",c => c.String());
            AddColumn("dbo.Deals","LenderName",c => c.String());
        }
    }

问题是,原始数据库没有此字段,并且通过此迁移脚本,它假定要添加数据库.要更新这些字段,如果我运行update-migration -force,由于上面的up()函数失败,因为它尝试从表中删除列.为什么Microsoft要添加删除脚本,开发人员是否需要手动删除?请帮忙

解决方法

这里的提示discriminatorcolumn. EF应用认策略来实现继承,称为TPH,Table-Per-Hierarchy.当您在实体之间具有继承时,EF将自动生成discriminator字段.

您似乎在模型中进行了更多更改,而不是将这两个属性添加到现有实体:您可能将它们从派生类移动到基类,或者相反的方式.此外,您的DbContext似乎只包含基本实体或派生实体的DbSet,但两者都不包含.请注意,认情况下,迁移仅包括DbContext中包含的实体作为DbSets(您还可以在映射中显式包含或排除它们).因此,您的迁移仅在DbContext中生成实体的字段,而不是为另一个生成,EF正在解释您删除了这些属性,这就是您获得DropColumn句子的原因.

所以这里的解决方案是将缺少的DbSet添加到DbContext并再次生成迁移.

Here您可以获得有关TPH的更多信息.

一个不同的解释可能是,在多次运行Update-Database和Add-Migration并使用-force参数后,您的数据库处于与__MigrationHistory表的内容不一致的状态.我的建议是手动删除数据库,如果可能的话,生成一个干净的初始迁移并运行它.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐