303

这看起来像一个非常常见的任务,但我找不到一个简单的方法来做到这一点。EF迁移:回退上次应用的迁移?

我想撤消上次应用的迁移。我本来期望一个简单的命令,比如

PM> Update-Database -TargetMigration:"-1" 

相反,所有我能想出是:

PM> Get-Migrations 

Retrieving migrations that have been applied to the target database. 
201208012131302_Add-SystemCategory 
201207311827468_CategoryIdIsLong 
201207232247409_AutomaticMigration 
201207211340509_AutomaticMigration 
201207200025294_InitialCreate 

PM> Update-Database -TargetMigration:"CategoryIdIsLong" 

(至少我可以只使用名称,跳过时间戳...)

有没有更简单的方法?

回答

112

从EF 5.0起,您所描述的方法是首选的方法。一种解决方案是创建一个包装器PS脚本,它可以自动完成上述步骤。此外,请随时为此创建功能请求,或者更好地实施此功能! http://entityframework.codeplex.com/

+3

另一个细节:如果您有一个现有的手动迁移,您需要回滚到,但意识到您的“向下”方法并没有正确回滚,您可以编辑并保存它,然后重新运行update-database - 目标...直到它正确回滚。事实之后 - 在您已经应用之后修改手动迁移 - 不会将其变为不允许编辑的内容。 – 2013-12-04 08:13:08

+0

这对我不起作用。我得到的是“指定目标的迁移‘-1’不存在。 – tutiplain 2017-08-06 11:51:15

269

我想澄清到此主题:

Update-Database -TargetMigration:"name_of_migration" 

什么,你在上面做的是说,你想,直到你留下指定迁移回滚所有迁移。因此,如果你使用GET的迁移,你会发现,你有A,B,C,d和E,然后使用这个命令将回滚E和d让你C:

Update-Database -TargetMigration:"C" 

而且,除非任何人都可以做出相反的评论,我注意到你可以使用序数值和short-Target开关(因此,-Target与-TargetMigration相同)。如果你想回滚所有迁移,并开始了,你可以使用:

update-database -target:0 

0,上面会回滚甚至第一迁移(这是一个破坏性的命令 - 要确保你知道你在做什么在使用它之前!) - 如果您使用上面需要目标迁移名称的语法(应用迁移之前不存在第0个迁移的名称!),则无法执行此操作!所以在这种情况下,你必须使用0(有序)值。同样,如果您已应用迁移A,B,C,D和E(按此顺序),则序号1应该参考A,序数2应参考B,等等。因此,回滚到B您可以使用两种:

Update-Database -TargetMigration:"B" 

Update-Database -TargetMigration:2 
+21

索引为0的迁移的名称是'$ InitialDatabase'。 – MEMark 2014-09-09 19:52:51

+0

感谢。是否有任何$(名称)值参考其它指标等位置,为$ LatestDatabase,或类似的东西? – Jazimov 2014-09-10 05:07:00

+0

我不知道。我一直无法通过简单的google搜索找到任何也许浏览EF源代码,就会发现它们呢? – MEMark 2014-09-11 06:57:29

8

解决的办法是:

Update-Database –TargetMigration 201609261919239_yourLastMigrationSucess 
+5

这是在问题已经说了,提问者已经知道这一点。我不明白这有什么帮助,也许你可以做得更清楚? – ANeves 2016-12-30 14:18:03

28

EntityFrameworkCore

Update-Database 20161012160749_AddedOrderToCourse 

20161012160749_AddedOrderToCourse是您想要回滚的迁移名称。

+1

创业板!我花了一段时间才找到这个答案(因为他们已经改变了它的.NET核心)。绝对值得赞赏! – HockeyJ 2016-10-28 13:07:39

+1

没有工作,现在 – 2016-12-23 18:56:16

+0

尝试过,但不起作用了 – xiamx 2018-01-14 23:43:47