为什么Add-Migration有时会创建重复的迁移?

时间:2013-10-02 11:40:56

标签: c# .net database entity-framework ef-code-first

我在实体框架版本5中遇到代码优先迁移的奇怪问题。有时Update-Database由于挂起的更改而失败,但Add-Migration命令仅生成包含在上次迁移中已包含的数据库更改的迁移数据库是最新的。因此,我希望新的迁移是空的。

Add-Migration如何检测到哪些更改?它似乎没有使用数据库作为源。

1 个答案:

答案 0 :(得分:50)

数据库模型的快照与.resx文件中的每次迁移一起保存。添加新迁移时,EF会将当前数据库模型(从您的模型类和DbModelBuilder中的设置生成)与上次迁移进行比较,并确定它们之间的更改。

如果您的迁移不同步,则可能会出现您所描述的问题。如果两个开发人员进行两次独立迁移,并且稍后将这些迁移合并回默认分支,则会发生这种情况。

示例:

  

开发人员1

     

迁移AddColumnA

     

开发人员2

     

迁移AddColumnB

     

合并版本

     

迁移AddColumnA - 数据库快照包括columnA

     

迁移AddColumnB - 数据库快照包括columnB但不包括   columnA

如果添加其他迁移,则会根据迁移AddColumnB确定更改,这些更改不包含有关columnA的信息。此问题的解决方法是生成虚拟迁移(使用空的Up和Down方法),以便在上次迁移中拥有正确的数据库模型快照。

  

合并版本

     

迁移AddColumnA - 数据库快照包括columnA

     

迁移AddColumnB - 数据库快照包括columnB但不包括   columnA

     

Migration Dummy - 包含columnA和columnB的数据库快照