在源代码管理中更改分支之后,运行Update-
Database回滚到以前的迁移,EF有时会显示文本“还原自动迁移”,如下所示:
Reverting automatic migration: 201305171619008_DescriptiveNameForMigration. Reverting code-based migration: 201305162023299_Init.
实体框架如何确定迁移应该是自动的,它有什么不同?
以下是如何重现它,假设您有一个已经设置了代码优先迁移的项目:
>切换到源控件中的新分支
>更改模型,映射器并添加迁移
更新数据库
>切换回默认分支
>更新数据库 – 目标迁移:0 -Force
>请参见Update-Database命令的结果中的“还原自动迁移”
这是我认为的情况,如果我错了,请纠正我.
>更新 – 数据库枚举__MigrationHistory中的迁移
>它在项目中找到相应的迁移文件,并调用Down()方法
>如果相应的迁移文件不存在,那么它将根据__MigrationHistory中的快照执行关于如何回滚迁移的最佳猜测
解决方法
当您构建迁移时,Entity Framework将在__MigrationsHistory中记录的最后一个模型与当前模型之间执行diff,并创建一个包含该diff的迁移类.您可以自由地编辑脚手架迁移的Up和Down方法.
自动迁移让您跳过脚手架.如果它们已启用,并且调用Update-Database,它将执行当前模型和__MigartionsHistory中记录的最后一个模型的差异,并使用“自动”迁移应用该diff.自动迁移仍然在__MigrationHistory中获得记录,但不会将任何迁移类添加到项目中.差异的步骤与Up方法中的脚本相同,但是从来没有机会自定义它.
当您还原其中一个自动迁移时,它会执行其已记录的模型的差异以及之前迁移的模型.这些步骤与脚手架的Down方法相同.
如果实体框架找不到用于迁移的迁移类,则它假定它是自动迁移.因此,如果您自定义了Down方法,则在还原期间不会应用这些自定义.
希望这让事情变得更清楚一些.