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"

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

有没有更简单的方法?

457522 次浏览

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

# EYZ0

或者使用您的迁移示例

# EYZ0

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

我想对这个帖子做一些澄清:

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月编辑:

根据类似问题的相关回答, EF Core 1.1的正确命令是-Target, EF Core 2.0的正确命令是-Migration

解决方案是:

Update-Database –TargetMigration 201609261919239_yourLastMigrationSucess

在# EYZ0:

Update-Database 20161012160749_AddedOrderToCourse

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

额外提示:

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

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

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

# EYZ0

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

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

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

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

update-database 0

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

Update-Database –TargetMigration:"Your migration name"

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

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

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

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

Update-Database –TargetMigration:Your_Migration_Index -force

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

# EYZ0

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

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

dotnet ef migrations list
dotnet ef database update NameOfYourMigration

NameOfYourMigration的位置输入您想要还原到的迁移的名称。

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

dotnet ef migrations remove

我通过我的(BASH GIT)控制台实体框架核心运行我的。Update-Database命令将不能在包控制台之外工作,我必须使用donet ef命令。

donet ef database update [Name of previous Migration]

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

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

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

这些都是大家都知道的,但我想给大家一些细节以防你第一次做。

英孚的核心

# EYZ0

(还原迁移)

# EYZ0

为我工作

在本例中是原始问题 (yourMigrationName = CategoryIdIsLong)

.

英孚的核心

更新数据库到上一个点

update-database CategoryIdIsLong

然后,去除不好的迁移

remove-migration