14

在源代码管理中更改分支后,运行 Update-Database 以回滚到以前的迁移,EF 有时会显示文本“正在恢复自动迁移”,如下所示:

Reverting automatic migration: 201305171619008_DescriptiveNameForMigration.
Reverting code-based migration: 201305162023299_Init.

Entity Framework 如何确定迁移应该是自动的,它有什么不同?

以下是如何重现它,假设您有一个已经设置了代码优先迁移的项目:

  1. 切换到源代码管理中的新分支
  2. 更改模型、映射器并添加迁移
  3. 更新数据库
  4. 切换回默认分支
  5. 更新数据库-TargetMigration:0 -Force
  6. 请参阅 Update-Database 命令的结果中的“恢复自动迁移”

这就是我认为正在发生的事情,如果我错了,请纠正我。

  • Update-Database 枚举 __MigrationHistory 中的迁移
  • 在项目中找到对应的迁移文件,调用 Down() 方法
  • 如果对应的迁移文件不存在,则根据 __MigrationHistory 中的快照对如何回滚迁移进行最佳猜测
4

1 回答 1

3

当您构建迁移时,Entity Framework 将在 __MigrationsHistory 中记录的最后一个模型和当前模型之间执行差异,并创建一个包含该差异的迁移类。您可以自由编辑该脚手架迁移的 Up 和 Down 方法。

自动迁移可让您跳过脚手架。如果它们已启用并且您调用 Update-Database,它将执行您当前模型和 __MigartionsHistory 中记录的最后一个模型的差异,并使用“自动”迁移应用该差异。自动迁移仍然会在 __MigrationHistory 中获得记录,但不会将迁移类添加到您的项目中。diff 的步骤与 Up 方法中的脚手架相同,但您永远没有机会自定义它。

当您恢复其中一个自动迁移时,它会执行它记录的模型和先前迁移的模型的差异。这些步骤与脚手架 Down 方法中的步骤相同。

如果 Entity Framework 找不到迁移的迁移类,则假定它是自动迁移。因此,如果您自定义了 Down 方法,则在还原时不会应用这些自定义项。

希望这能让事情更清楚一些。

于 2013-06-06T16:27:55.413 回答