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

Jan*_*ard 31 .net c# database entity-framework ef-code-first

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

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

Luk*_*brt 52

数据库模型的快照与.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的数据库快照

  • 很有意思.有没有办法防止基于该资源文件创建迁移,以便将数据库用作引用?在我看来,这是迁移的一个严重缺点,因为我真的想拥有EXPLICIT迁移文件而不仅仅是自动迁移,但是当在同一代码库上使用多个开发人员时,不希望拥有大量虚拟迁移文件. (2认同)
  • 恕我直言,没有办法指定数据库作为参考.您可以更新到第一次迁移(AddColumnA),然后重新生成第二次迁移,而不是创建虚拟迁移.Up和Down方法将保持相同,但数据库快照将更新为正确的版本,并且不需要进行虚拟迁移. (2认同)
  • 4年了,还是有这些问题。叹。 (2认同)