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

时间:2012-08-10 15:14:14

标签: entity-framework entity-framework-4 database-migration ef-migrations

这看起来是一项非常常见的任务,但我找不到一种简单的方法。

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

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"

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

有更简单的方法吗?

15 个答案:

答案 0 :(得分:354)

我想在这个帖子中添加一些说明:

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年1月:

根据类似问题的相关answer,正确的参数名称为-Target(对于EF Core 1.1)或-Migration(对于EF Core 2.0)

答案 1 :(得分:133)

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

答案 2 :(得分:58)

EntityFrameworkCore

Update-Database 20161012160749_AddedOrderToCourse

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

答案 3 :(得分:11)

解决方案是:

Update-Database –TargetMigration 201609261919239_yourLastMigrationSucess

答案 4 :(得分:6)

我意识到利用CLI dotnet命令并没有什么好的解决方案,所以这是一个:

dotnet ef migrations list
dotnet ef database update NameOfYourMigration

NameOfYourMigration处,输入要还原到的迁移的名称。

答案 5 :(得分:3)

补充提醒:

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

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

答案 6 :(得分:1)

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

如果迁移可能会导致数据丢失,则控制台建议您这样做:

  

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

答案 7 :(得分:1)

update-database 0

This will roll back all migrations in EFCore

答案 8 :(得分:1)

Update-Database –TargetMigration:"Your migration name"

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

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

答案 9 :(得分:1)

我发现在“程序包管理器控制台”中运行时可以正常工作:

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

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

答案 10 :(得分:1)

EF CORE

PM> Update-Database yourMigrationName

(还原迁移)

PM> Update-Database

为我工作

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

答案 11 :(得分:0)

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

Update-Database 201207211340509_MyMigration -context myDBcontext

(其中201207211340509_MyMigration是您要回滚的迁移,而myDBcontext是您的数据库上下文的名称)

答案 12 :(得分:0)

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

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

Update-Database –TargetMigration:Your_Migration_Index -force

答案 13 :(得分:0)

我通过我的(BASH GIT)控制台运行了我的游戏,该控制台也运行了 Entity Framework Core Update-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]

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

答案 14 :(得分:0)

EF 核心

更新数据库到上一点

test

然后,删除错误的迁移

testTwo