C# 实体框架-代码优先方法

C# 实体框架-代码优先方法,c#,sql,sql-server,entity-framework,C#,Sql,Sql Server,Entity Framework,我只是在我的项目中遵循实体框架代码优先的方法,我遇到了一些问题。我总是被迫使用命令重新生成数据库。然而,现在我设法得到了稳定。我有一个场景,在这个场景中,框架正在创建一个迁移脚本是不符合逻辑的,可能是我遗漏了一些东西,需要您的帮助 这个场景是-我已经启用了迁移,它用我所有的表设置创建了一个InitialCreate类,这给我留下了深刻的印象。但当我在实体中进行更改时,例如,我有交易类 我添加了一个名为LenderName、borroderName的新属性,并运行了添加迁移脚本,它为我创建了一个迁

我只是在我的项目中遵循实体框架代码优先的方法,我遇到了一些问题。我总是被迫使用命令重新生成数据库。然而,现在我设法得到了稳定。我有一个场景,在这个场景中,框架正在创建一个迁移脚本是不符合逻辑的,可能是我遗漏了一些东西,需要您的帮助

这个场景是-我已经启用了迁移,它用我所有的表设置创建了一个InitialCreate类,这给我留下了深刻的印象。但当我在实体中进行更改时,例如,我有交易类

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

 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()函数试图从表中删除列。为什么微软要添加删除脚本,是因为开发者需要手动删除?请帮助

这里的提示是
鉴别器
列。EF应用一个默认策略来实现称为TPH的继承,即每个层次的表。当实体之间存在继承时,EF会自动生成
鉴别器
字段

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

因此,这里的解决方案是将缺少的
DbSet
添加到
DbContext
并再次生成迁移

你可以有更多关于TPH的信息

另一种解释可能是,在多次运行
updatedatabase
addmigration
并使用
-force
参数后,数据库处于与
\u MigrationHistory
表内容不一致的状态。我的建议是手动删除数据库,如果可能的话,生成一个干净的
初始
迁移并运行它