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

Cri*_*scu 406 entity-framework database-migration entity-framework-4 ef-migrations

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

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

PM> Update-Database -TargetMigration:"-1"
Run Code Online (Sandbox Code Playgroud)

相反,我能想出的就是:

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"
Run Code Online (Sandbox Code Playgroud)

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

有没有更简单的方法?

Jaz*_*mov 384

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

Update-Database -TargetMigration:"name_of_migration"
Run Code Online (Sandbox Code Playgroud)

您在上面所做的是说您希望回滚所有迁移,直到您指定了迁移.因此,如果您使用GET-MIGRATIONS并且发现您有A,B,C,D和E,那么使用此命令将回滚E和D以使您进入C:

Update-Database -TargetMigration:"C"
Run Code Online (Sandbox Code Playgroud)

此外,除非有人可以发表相反的评论,否则我注意到你可以使用序数值和短的-Target开关(因此,-Target与-TargetMigration相同).如果要回滚所有迁移并重新开始,可以使用:

Update-Database -Target:0
Run Code Online (Sandbox Code Playgroud)

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

Update-Database -TargetMigration:"B"
Run Code Online (Sandbox Code Playgroud)

要么

Update-Database -TargetMigration:2
Run Code Online (Sandbox Code Playgroud)

编辑2019年1月:

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

  • 索引为0的迁移名称为`$ InitialDatabase`. (27认同)
  • 仅供参考,我们刚刚遇到了这个问题并希望与OP做同样的事情...使用`ls变量:*`它看起来像`$ InitialDatabase`只是一个定义为0的PowerShell变量,没有任何其他变量即使在当前的EF源代码中也定义了.并且,get-migrations不会返回任何内容,它只会写入控制台,因此您无法迭代返回的对象... (2认同)

And*_*ers 140

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

  • 另一个细节:如果你有一个现有的手动迁移,你需要回滚,但实现你的"向下"方法并没有真正回滚正确,你可以编辑并保存它,然后重新运行update-database -target ..直到它正确回滚 事后修改手动迁移 - 在您已经应用它之后 - 不会将其转换为不允许编辑的内容. (4认同)
  • -TargetMigration 不起作用,但 -Migration 起作用,EF Core 5.0.7 (3认同)
  • 这对我不起作用。我得到的只是“指定的目标迁移“-1”不存在。 (2认同)
  • @tutiplain 看看他的第二个代码块。你引用他希望存在的东西,而不是已经存在的东西。 (2认同)

Mac*_*sCK 64

EntityFrameworkCore中:

Update-Database 20161012160749_AddedOrderToCourse
Run Code Online (Sandbox Code Playgroud)

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

  • 您不需要包含日期/时间.你可以直接输入名字. (4认同)
  • 宝石!我花了一段时间才找到这个答案(因为他们已经为.NET Core改变了它).绝对值得一个upvote! (2认同)

pin*_*oad 18

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

dotnet ef migrations list
dotnet ef database update NameOfYourMigration
Run Code Online (Sandbox Code Playgroud)

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

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

dotnet ef migrations remove
Run Code Online (Sandbox Code Playgroud)


Max*_*Max 13

解决方案是:

Update-Database –TargetMigration 201609261919239_yourLastMigrationSucess
Run Code Online (Sandbox Code Playgroud)

  • 这已经在问题中说过,提问者已经知道了这一点.我不知道这有什么帮助,也许你可以让它更清楚? (9认同)

小智 8

英孚核心

PM> Update-Database yourMigrationName

(恢复迁移)

PM> Update-Database

为我工作

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


LCa*_*ter 6

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

donet ef database update [Name of previous Migration]
Run Code Online (Sandbox Code Playgroud)

这将运行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]
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

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

一个操作被搭建起来,可能会导致数据丢失。请检查迁移的准确性。要撤消此操作,请使用删除迁移。

  • 仅当迁移尚未应用于数据库时才有效。 (2认同)

mat*_*ntz 5

update-database 0
Run Code Online (Sandbox Code Playgroud)

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