为什么添加迁移有时会创建重复迁移

本文关键字:迁移 创建 添加 为什么 | 更新日期: 2023-09-27 18:33:31

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

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

为什么添加迁移有时会创建重复迁移

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

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

例:

开发人员 1

迁移添加列

A

开发人员 2

迁移添加列B

合并版本

迁移添加列 A - 数据库快照包括列 A

迁移添加列 B - 数据库快照包括列 B,但不包括列 B 列 A

如果添加另一个迁移,则会根据迁移 AddColumnB(不包含有关列 A 的信息(确定更改。此问题的解决方法是生成虚拟迁移(使用空的 Up 和 Down 方法(,只是为了在上次迁移中获得正确的数据库模型快照。

合并版本

迁移添加列 A - 数据库快照包括列 A

迁移添加列 B - 数据库快照包括列 B,但不包括列 B 列 A

迁移虚拟 - 具有列 A 和列 B 的数据库快照