2014-09-10 50 views
0

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

存在初始迁移和额外的手动编辑迁移,该迁移定义了索引视图。没有其他迁移。

我最近添加了一个属性到一个类。当我创建一个新的模式时,该属性被创建。但是,我不明白为什么会创建它,因为在任何迁移中都没有提及该属性。

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

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

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

每个表中的列名必须是唯一的。表'dbo.MyTable'中的列名'MyNewProperty'被多次指定。

在我的DbContext的构造函数中。

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

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

+0

是否启用自动迁移?在'Migrations'文件夹中,你应该有一个'Configuration'类,看看'AutomaticMigrationsEnabled'的构造函数。 – Lukazoid 2014-09-10 19:59:43

+0

@Lukazoid:是的,自动迁移已启用。 – 2014-09-10 20:08:24

+0

那么这将是新列的来源,自动迁移意味着Entity Framework将自动将您的域实体上的任何新属性映射到SQL列。 – Lukazoid 2014-09-10 20:11:32

回答

1

如果您未为此新属性明确添加基于代码的迁移(使用添加迁移),但正在创建列,则可确定automatic migrations已启用。

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

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

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

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

+0

谢谢,这是有道理的。 – 2014-09-10 20:51:53