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