找到迁移源

时间:2014-09-10 19:55:23

标签: entity-framework entity-framework-6 ef-migrations

我有一个刚开始使用EF迁移的项目。

有一个初始迁移和一个额外的手动编辑的迁移,用于定义索引视图。没有其他迁移。

我最近在一个类中添加了一个属性。当我创建新架构时,将创建该属性。但是,我无法理解为什么会创建它,因为在任何迁移中都没有提到该属性。

如果我搜索整个源代码文件夹(包含子文件夹,)以提及该属性名称,它不会出现在任何EF迁移代码中(它只出现在它所在的类中)已定义,并在几行代码中访问属性。)

当我在两个现有迁移的Up()方法的开头和结尾设置断点时,我可以看到初始迁移(在SSMS中验证)创建的表没有附加属性,并且在上一次Up()迁移结束时,属性尚不存在。在控制离开最后一次迁移后的某个时间,某些代码会在数据库中为此附加属性创建一个列。

为了尝试跟踪此问题,我将此新属性手动编辑到初始迁移中。现在,在上次迁移的Up()方法退出后,我得到一个SqlException

  

每个表中的列名必须是唯一的。专栏名称' MyNewProperty'在表格中,dbo.MyTable'被指定不止一次。

在我的DbContext的构造函数中。

堆栈跟踪仅显示实例化DbContext的代码。

如何跟踪此额外迁移的来源?

1 个答案:

答案 0 :(得分:1)

如果您没有为此新属性显式添加基于代码的迁移(使用add-migration),但正在创建列,则可以确定已启用automatic migrations

自动迁移允许Entity Framework自动确定表示对域模型所做的任何更改所需的架构更改,这就是添加新列的原因。

您还想知道为什么即使您手动编辑基于代码的迁移以添加此新列,它仍会尝试添加新列;对于每个基于代码的迁移,都有一个生成的代码隐藏文件(.Designer.cs),其中包含string IMigrationMetadata.Target属性,这将返回应用此迁移后域模型外观的字符串快照。

手动编辑迁移文件时,此Target属性仍会返回域的旧字符串表示形式,该字符串不包含新属性;因此,自动迁移会尝试添加重复列。

解决方法是将新属性添加到域中,然后使用add-migration命令为此新属性添加基于代码的新迁移。