EF迁移:回滚上一次应用的迁移?


435

这看起来是一个非常普通的任务,但是我找不到一种简单的方法来完成它。

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

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"

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

有没有更简单的方法?


1
遗憾的是,我们已经过了多年了,没人真正读过这个问题。
Daniel ZA

Answers:


160

从EF 5.0开始,您描述的方法是首选方法。所以

PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"

或使用示例迁移

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

一种解决方案是创建一个包装器PS脚本,以自动执行上述步骤。此外,随时可以为此创建功能请求,或者更好地实现它!https://github.com/dotnet/ef6


4
另一个细节:如果您有一个现有的手动迁移,则需要回滚,但是意识到您的“ Down”方法并不能真正回滚,您可以编辑并保存它,然后重新运行update-database -target。直到它正确回滚。事后修改手动迁移-在您已将其应用后-不会将其变成不允许编辑的内容。
克里斯·莫斯基尼

1
这对我不起作用。我得到的只是“指定的目标迁移” -1”不存在
。– tutiplain

2
@tutiplain看看他的第二个代码块。您引用了他希望存在的东西,而不是存在的东西。
Sinjai

使用dotnet命令执行此操作的正确方法是什么?对不起,我在文档中找不到或我丢失了一些东西。通过entityframeworktutorial.net/efcore/…尝试过 吗?
Sijan Shrestha

我找到了解决方案,dotnet ef database update LastGoodMigration但是,这似乎令人困惑,因为我来自节点背景并使用knex sequlize,他们有一个命令可以验证最近的更改,是否有任何命令可以恢复应用到数据库的最后一个操作?
Sijan Shrestha

415

我想对此线程添加一些说明:

Update-Database -TargetMigration:"name_of_migration"

上面的操作是要回滚所有迁移,直到剩下指定的迁移为止。因此,如果您使用GET-MIGRATIONS,并且发现自己拥有A,B,C,D和E,那么使用此命令将回滚E和D以使您到达C:

Update-Database -TargetMigration:"C"

另外,除非有人可以提出相反的意见,否则我注意到您可以使用序数值和简短的-Target开关(因此-Target与-TargetMigration相同)。如果要回滚所有迁移并重新开始,可以使用:

Update-Database -Target:0

上面的0甚至会回滚FIRST迁移(这是一个破坏性的命令-确保在使用它之前先知道自己在做什么!)-如果您使用上面的语法要求名称为目标迁移(应用迁移之前,第0个迁移的名称不存在!)。因此,在这种情况下,您必须使用0(常规)值。同样,如果您已应用迁移A,B,C,D和E(按此顺序),则序数1应该引用A,序数2应该引用B,依此类推。因此,要回滚到B,您可以使用以下任一方法:

Update-Database -TargetMigration:"B"

要么

Update-Database -TargetMigration:2

编辑2019年10月:

根据 类似问题的相关答案,正确的命令适用-Target于EF Core 1.1,而-Migration适用于EF Core 2.0。


27
索引为0的迁移的名称为$InitialDatabase
MEMark 2014年

1
谢谢。是否有任何$(name)值引用其他索引位置,例如$ LatestDatabase或类似的东西?
Jazimov 2014年

我不知道。我一直无法通过简单的谷歌搜索找到任何东西。也许浏览EF源代码可以发现它们?
2014年

3
仅供参考,我们只是遇到了这个问题,并希望与OP做同样的事情...使用ls variable:*它似乎$InitialDatabase只是将PowerShell变量定义为0,甚至在当前EF源代码中也没有定义任何其他变量。而且,get-migrations不返回任何内容,它仅写入控制台,因此您无法迭代返回的对象……
DrewJordan 2014年

1
这应该是答案
WtFudgE

76

EntityFrameworkCore中

Update-Database 20161012160749_AddedOrderToCourse

20161012160749_AddedOrderToCourse您要回滚到的迁移的名称在哪里。


3
宝石!我花了一段时间找到了这个答案(因为他们已经将其更改为.NET Core)。绝对值得投票!
HockeyJ

4
您不需要包括日期/时间。您可以输入名称。
理查德·马斯克

1
这对我不起作用...它将说“完成”,但在我指定的迁移之后的所有迁移仍将保留。在任何这些迁移中,都没有执行任何“ Down”代码。
egmfrs

您也可以像这样进行特定的迁移:Update-Database -Migration:“ AddedOrderToCourse”特别是在迁移名称中使用空格时,这是一种方法。(即Update-Database -Migration“向课程添加订单”)
SwissCoder

13

解决方案是:

Update-Database TargetMigration 201609261919239_yourLastMigrationSucess

10
这已经在问题中说了,提问者已经知道了这一点。我不知道这有什么帮助,也许您可​​以说得更清楚些?
2013年

这个答案更加简洁。TY Max!
andreikashin

4

附加提醒:

如果您有多种配置类型,则需要指定[ConfigurationName]

Update-Database -Configurationtypename [ConfigurationName] -TargetMigration [MigrationName]

3

Remove-Migration添加错误迁移后,您可以在EF Core 中在软件包管理器控制台中输入命令。

如果您的迁移可能涉及数据丢失,则控制台建议您这样做:

脚手架操作可能会导致数据丢失。请检查迁移的准确性。要撤消此操作,请使用Remove-Migration。


3
update-database 0

警告:这将回滚EFCore中的所有迁移!请小心使用:)


2

我发现在Package Manager控制台中运行时可以使用:

dotnet ef migrations list | select -Last 2 | select -First 1 | ForEach-Object { Update-Database -Migration $_ }

您可以创建一个使它更容易的脚本。


1

我正在使用EntityFrameworkCore,并使用@MaciejLisCK的答案。如果您有多个数据库上下文,则还需要通过添加上下文参数来指定上下文,例如:

Update-Database 201207211340509_MyMigration -context myDBcontext

201207211340509_MyMigration您要回滚到的迁移在哪里,并且myDBcontext是数据库上下文的名称)



0

万一有可能发生数据丢失,由于默认情况下EF因为AutomaticMigrationDataLossAllowed = false而无法完成update-database命令,因此除非您使用-force参数运行该操作,否则它会回滚该操作。

Update-Database TargetMigration:"Your migration name" -force

要么

Update-Database TargetMigration:Your_Migration_Index -force
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.