514

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

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

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"

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

有没有更简单的方法?

4

15 回答 15

454

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

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,上面,甚至会回滚第一次迁移(这是一个破坏性的命令——确保你在使用它之前知道你在做什么!)——如果你使用上面需要名称的语法,这是你无法做到的目标迁移(在应用迁移之前,第 0 个迁移的名称不存在!)。因此,在这种情况下,您必须使用 0(序数)值。同样,如果您已应用迁移 A、B、C、D 和 E(按此顺序),则序数 1 应引用 A,序数 2 应引用 B,依此类推。所以要回滚到 B 你可以使用:

Update-Database -TargetMigration:"B"

或者

Update-Database -TargetMigration:2

2019 年 10 月编辑:

根据this related answer on a similar question,正确的命令-Target适用于EF Core 1.1,而-Migration适用于EF Core 2.0。

于 2014-05-21T20:41:44.547 回答
236

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

PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"

或使用您的示例迁移

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

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

于 2012-08-13T18:38:14.670 回答
106

EntityFrameworkCore 中

Update-Database 20161012160749_AddedOrderToCourse

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

于 2016-10-13T12:25:00.823 回答
31

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

dotnet ef migrations list
dotnet ef database update NameOfYourMigration

NameOfYourMigration输入您要恢复到的迁移名称的地方。

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

dotnet ef migrations remove
于 2020-06-25T07:36:14.047 回答
17

解决方案是:

Update-Database –TargetMigration 201609261919239_yourLastMigrationSucess
于 2016-09-27T23:40:27.703 回答
10

英孚核心

PM> Update-Database yourMigrationName

(恢复迁移)

PM> Update-Database

为我工作

在这种情况下,原始问题(yourMigrationName = CategoryIdIsLong)

于 2020-11-04T17:00:11.840 回答
6
update-database 0

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

于 2019-04-16T01:57:12.130 回答
4

额外提醒:

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

Update-Database -Configurationtypename [ConfigurationName] -TargetMigration [MigrationName]
于 2018-05-18T02:04:20.453 回答
4

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

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

搭建了一个可能导致数据丢失的操作。请检查迁移的准确性。要撤消此操作,请使用 Remove-Migration。

于 2018-08-06T16:14:43.187 回答
3

我通过我的(BASH GIT)控制台运行我的也运行Entity Framework CoreUpdate-Database命令在包控制台之外不起作用,我必须使用这些donet ef命令。

donet ef database update [Name of previous Migration]

这将运行protected override void Down(MigrationBuilder migrationBuilder)您当前迁移的方法和所有其他方法,以返回您设置的数据库版本。

我也使用-p [migration project] -s [Project Solution]. 这也允许它指向我的appsettings.[Enviorment].json,其中存储了我访问数据库的密码。

export ASPNETCORE_ENVIRONMENT=[ENVIORMENT]; donet ef database update [Name of previous Migration] -p [Migration Project Name] -s [Solution Name]

其中很多可能是已知的,但如果您第一次这样做,希望提供详细信息。

于 2020-07-22T17:33:41.620 回答
3

英孚核心

将数据库更新到上一点

update-database CategoryIdIsLong

然后,删除不良迁移

remove-migration
于 2021-06-14T22:37:32.480 回答
2

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

Update-Database 201207211340509_MyMigration -context myDBcontext

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

于 2018-07-30T06:14:35.767 回答
2
Update-Database –TargetMigration:"Your migration name"

对于这个问题,我建议这个链接:

https://elegantcode.com/2012/04/12/entity-framework-migrations-tips/

于 2019-09-23T05:48:00.927 回答
2

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

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

您可以创建一个脚本,使其更容易。

于 2019-11-12T18:53:20.310 回答
0

如果有数据丢失的可能性,EF 不会完成 update-database 命令,因为 AutomaticMigrationDataLossAllowed = false 默认情况下,并且会回滚操作,除非您使用-force参数运行它。

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

或者

Update-Database –TargetMigration:Your_Migration_Index -force
于 2019-11-01T07:06:23.427 回答