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

我想撤消上一次应用的迁移。我本以为会有个简单的命令,比如

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"

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

有没有更简单的方法?


当前回答

我使用EntityFrameworkCore,我使用@MaciejLisCK的答案。如果你有多个DB上下文,你还需要通过添加context参数来指定上下文,例如:

Update-Database 201207211340509_MyMigration

(其中201207211340509_MyMigration是你想要回滚到的迁移,myDBcontext是你的DB上下文的名称)

其他回答

截至EF 5.0,您描述的方法是首选的方法。所以

PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"

或者使用您的迁移示例

Update-Database -TargetMigration:"CategoryIdIsLong"

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

我发现当在包管理器控制台中运行时,这是有效的:

dotnet ef migrations list | select -最后2 | select -第1 | ForEach-Object {Update-Database -Migration $_}

您可以创建一个脚本来简化它。

我使用EntityFrameworkCore,我使用@MaciejLisCK的答案。如果你有多个DB上下文,你还需要通过添加context参数来指定上下文,例如:

Update-Database 201207211340509_MyMigration

(其中201207211340509_MyMigration是你想要回滚到的迁移,myDBcontext是你的DB上下文的名称)

我意识到使用CLI的dotnet命令没有任何好的解决方案,所以这里有一个:

dotnet ef migrations list
dotnet ef database update NameOfYourMigration

在NameOfYourMigration的位置输入您想要恢复到的迁移的名称。

然后您可以删除所有恢复的迁移,以便更好地使用

dotnet ef migrations remove

额外提示:

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

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