2016-11-20 214 views
4

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

该场景是 - 我已经启用迁移,并创建了一个InitialCreate所有我的表设置,我对此印象深刻。但是当我在实体做出改变,例如,我有新政类

我添加了名为LenderName,BorrowerName新的属性和运行TEH附加迁移脚本,它创建了一个迁移脚本对我来说,

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()函数而失败。为什么微软正在添加该drop脚本,是开发人员需要手动删除的?请帮忙

回答

0

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

看来,你没有在你的模型不是增加这两个属性到现有实体更多的变化:你可能搬到他们从派生类的基类,或周围的正好相反。此外,您的DbContext似乎只包含DbSet用于基本实体或派生实体,但不适用于两者。请注意,迁移在默认情况下仅包含DbContext中包含的实体,即DbSets(您也可以在映射中明确包含或排除它们)。因此,您的迁移仅为您的DbContext中的实体生成字段,而不是另一个生成实体的字段,并且EF正在解释您删除了这些属性,这就是为什么您会得到DropColumn句子。

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

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

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

相关问题