实体框架迁移更改检测

时间:2015-11-14 12:43:18

标签: c# database entity-framework migration

我最近一直在研究EF迁移的工作方式,而且我遇到了一个我无法理解的问题。

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

screen from msdn

  

在此阶段,开发人员#2可以运行将检测的Update-Database   新的AddRating迁移(尚未应用于Developer   2的数据库)并应用它。现在,“评级”列已添加到“博客”表中,数据库与模型同步。

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

  1. 假设我们在项目中有两个迁移(使用ID 4和5),这些迁移尚未应用于db(例如,我们获得了旧版本的db,并且应用了1,2和3次迁移)。
  2. 运行更新Db命令。
  3. EF转到db,查找MigrationHistory表并获取最新的迁移。然后,EF发现项目中存在迁移4和5,并且由于db中的最新迁移为3,因此它适用于4和5.
  4. 然而,当我从文章中看到屏幕时,我并没有真正理解它。以下是我的期望:

    1. Dev 2数据库中有迁移First,AddUrl和AddReaders。
    2. EF查找数据库中的最新迁移 - 它是AddReaders。
    3. 项目中的最新迁移也是AddReaders。
    4. 因此,根本不需要进行任何更改。
    5. 存在一个问题,即代码模型和最新的迁移模型不尽相同,但EF无论如何都能够对数据库应用更改,但会产生警告,如文章所述。

      问题是,在我的推理中我犯了什么错误以及EF如何理解即使db和代码中的最新迁移是相同的,也必须应用另一个迁移。

      另外,据我所知,当运行Add-Migration命令时,MigrationHistory中的压缩模型只提供 ,并且与Update-Database命令无关。是这样吗?

1 个答案:

答案 0 :(得分:2)

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

迁移按MigrationId进行比较,因此您是对的,压缩模型与Update_Database命令无关。