【问题标题】:Entity Framework migrations changes detection实体框架迁移更改检测
【发布时间】:2015-11-14 12:43:17
【问题描述】:

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

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

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

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

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

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

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

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

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

此外,据我了解,MigrationHistory 中的压缩模型仅在运行 Add-Migration 命令时提供服务,与 Update-Database 命令无关。是这样吗?

【问题讨论】:

    标签: c# database entity-framework migration


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。您能否提供任何链接以进一步阅读?我已经在 SO 上问过一个关于迁移的问题,但事实证明没有人对它们很感兴趣。
    • 我不知道有多少关于这个主题的好文章。我认为您发布的链接是最好的链接之一。如果您不确定某些细节,您可以随时深入研究源代码 - entityframework.codeplex.com
    猜你喜欢
    • 1970-01-01
    • 2012-01-19
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    相关资源
    最近更新 更多