实体框架 - 代码优先方法

时间:2016-11-20 00:50:34

标签: c# sql sql-server entity-framework

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

场景是 - 我启用了迁移,它创建了一个包含所有表格设置的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要添加该删除脚本,开发人员是否需要手动删除?请帮忙

1 个答案:

答案 0 :(得分:0)

此处的提示是Discriminator列。 EF应用默认策略来实现继承,称为TPH,Table-Per-Hierarchy。当您的实体之间存在继承时,EF会自动生成Discriminator字段。

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

因此,此处的解决方案是将缺少的DbContext添加到Update-Database并再次生成迁移。

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

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