"还原自动迁移"是什么意思?

Nic*_*yle 14 database ef-migrations entity-framework-5

改变源控制分支,运行更新的数据库的回滚到先前的迁移之后,EF有时会显示文本"还原自动迁移",象下面这样:

Reverting automatic migration: 201305171619008_DescriptiveNameForMigration.
Reverting code-based migration: 201305162023299_Init.
Run Code Online (Sandbox Code Playgroud)

实体框架如何确定迁移应该是自动的,它的作用有何不同?

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

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

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

  • Update-Database枚举__MigrationHistory中的迁移
  • 它在项目中找到相应的迁移文件并调用Down()方法
  • 如果相应的迁移文件不存在,那么它执行的最佳猜测如何基于在__MigrationHistory快照回滚迁移

bri*_*lam 3

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

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

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

如果实体框架找不到迁移的迁移类,它会假定它是自动迁移。因此,如果您自定义了 Down 方法,则在恢复时不会应用这些自定义设置。

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