Entity Framework 迁移更改检测

Entity Framework migrations changes detection

我最近一直在研究 EF 迁移的工作原理,但遇到了一个我无法真正理解的问题。

我正在阅读 this 文章,这是我看到的内容:

At this stage Developer #2 can run Update-Database which will detect the new AddRating migration (which hasn’t been applied to Developer 2’s database) and apply it. Now the Rating column is added to the Blogs table and the database is in sync with the model.

我无法了解 EF 如何确定它必须应用 AddRatings 迁移中的更改。据我所知,工作流程如下:

  1. 假设我们在项目中有两个迁移(ID 为 4 和 5)尚未应用于数据库(例如,我们得到了应用了 1、2 和 3 迁移的旧版本数据库)。
  2. 更新 Db 命令是 运行。
  3. EF 转到数据库,查找 MigrationHistory table 并获取最新的迁移。然后,EF 看到项目中有迁移 4 和 5,由于数据库中的最新迁移是 3,因此它应用 4 和 5。

但是,当我从文章中查看屏幕时,我并没有真正理解它。这是我期望的结果:

  1. Dev 2 数据库中有迁移 First、AddUrl 和 AddReaders。
  2. EF 在数据库中查找最新的迁移 - 它是 AddReaders。
  3. 项目中最新的迁移也是AddReaders。
  4. 因此,根本不需要应用任何更改。

问题是代码模型和最新的迁移模型不一样,但 EF 无论如何都能够将更改应用到数据库,尽管会产生警告,如文章所述。

问题是,我的推理有什么错误以及 EF 如何理解即使数据库和代码中的最新迁移 相同 ,还有另一个迁移必须申请。

此外,据我所知,MigrationHistory 中的压缩模型仅在 Add-Migration 命令为 运行 时 提供 并且与此无关使用更新数据库命令。是这样吗?

执行更新时,EF 将来自程序集的迁移集与来自数据库的迁移集进行比较,并将所有缺失的迁移应用于数据库。丢失的迁移是在历史列表的末尾还是在中间的某个地方并不重要。

迁移由 MigrationId 比较所以你是对的,压缩模型与 Update_Database 命令无关。