【问题标题】:Insert a migration插入迁移
【发布时间】:2015-11-17 17:12:19
【问题描述】:

所以这就是故事。我们有一个使用 Entity Framework Code First 迁移的源代码控制产品。对于这个问题,有两个分支,开发和生产。目前,开发分支有几个迁移不在生产分支中,但它们从生产分支中的最后一个迁移开始依次进行。

现在,我们需要对生产分支进行小的架构更改。我们通过添加迁移来做到这一点。然后将其发布到生产站点。

那么,我们如何将这些变化整合到开发分支中呢?开发分支中的迁移必须来自生产站点上的内容,但我们只是在生产站点上插入了一个新的迁移。这意味着当我们合并到开发分支时,迁移会失败,因为存在乱序迁移。

那么,在我的开发分支中,有没有办法从另一个分支插入迁移,将现有的迁移分流到列表中?

【问题讨论】:

  • 生产分支中的更改是否与开发分支中已经进行的更改冲突?

标签: c# entity-framework ef-code-first entity-framework-6 entity-framework-migrations


【解决方案1】:

在合并来自不同开发人员的更改时,我已经处理过这个问题。在为这个答案做一些研究时,我遇到了this handy article,它可能比我能解释得更好。唉,你被我困住了。需要注意的几点:

  1. Entity Framework 不会每次都直接将数据库与您的类进行比较。相反,它会比较它生成的edmx 模型。

  2. 因此,您在尝试更新时会收到一条警告,上面写着

无法更新数据库以匹配当前模型,因为有待处理的更改并且自动迁移被禁用......

虽然它实际执行更新。该错误指的是它比较的快照(?)edmx

最简单的方法是添加一个空白的“合并迁移”。以下是文章中的步骤:

  1. 确保本地代码库中的任何待定模型更改都已写入迁移。此步骤可确保您不会错过任何 在生成空白迁移时进行合法更改。

  2. 与源代码管理同步。

  3. 运行 Update-Database 以应用其他开发人员签入的任何新迁移。

    注意:如果您没有从 Update-Database 命令中收到任何警告 然后没有来自其他开发人员的新迁移,并且有 无需执行任何进一步的合并。

  4. 运行 Add-Migration [pick_a_name] –IgnoreChanges(例如 Add-Migration Merge –IgnoreChanges)。这会生成一个迁移,其中包含所有 元数据(包括当前模型的快照),但会忽略 将当前模型与现有模型进行比较时检测到的任何变化 上次迁移中的快照(这意味着您会得到一个空白的 Up 和 Down 方法)。

【讨论】:

  • .edmx 文件不用于 EF 代码优先开发
  • 是的,他们是。它们只是不被开发人员使用。 __MigrationHistory 中的Model 列是base64 编码edmx 的GZipped 版本。这与每次迁移存储在 resx 文件中的 base64 编码 edmx 进行比较。
  • 你可以看到here一个解码模型的例子。
  • 也许是吹毛求疵,但我只想指出,没有任何.edmx 文件。我也很确定,Model 列未用于代码优先开发。生成新迁移时,会将当前模型与最新 .resx 文件中的模型进行比较,而不是与 DB 中的模型进行比较。
  • 好吧好吧,你找到我了。我用 model 替换了单词 file
猜你喜欢
  • 2012-07-27
  • 2018-05-21
  • 2016-06-29
  • 2018-06-22
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多