ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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"

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

有没有更简单的方法?

可悲的是,几年后我们在这里,没有人真正阅读过这个问题。

J
Jazimov

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

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,EF Core 1.1 的正确命令是 -Target,而 EF Core 2.0 的正确命令是 -Migration


索引为 0 的迁移的名称是 $InitialDatabase
谢谢。是否有任何 $(name) 值来引用其他索引位置,例如 $LatestDatabase 或类似的东西?
我不知道。我无法通过简单的谷歌搜索找到任何内容。也许浏览 EF 源代码会发现它们?
仅供参考,我们只是遇到了这个问题,并希望做与 OP 相同的事情......使用 ls variable:* 看起来 $InitialDatabase 只是一个定义为 0 的 PowerShell 变量,没有定义任何其他变量,即使在当前的 EF 源代码。而且,get-migrations 不会返回任何内容,它只会写入控制台,因此您无法遍历返回的对象......
这应该是答案
C
Caltor

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

PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"

或使用您的示例迁移

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

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


另一个细节:如果您有一个现有的手动迁移需要回滚,但意识到您的“向下”方法并没有真正正确回滚,您可以编辑并保存它,然后重新运行 update-database -target.. . 直到它正确回滚。事后修改手动迁移 - 在您已经应用它之后 - 不会将其变成不允许编辑的内容。
这对我不起作用。我得到的只是“指定的目标迁移”-1“不存在。
@tutiplain 看看他的第二个代码块。你引用他希望存在的东西,而不是确实存在的东西。
使用 dotnet 命令执行此操作的正确方法是什么?抱歉,我在文档中找不到,或者我遗漏了一些东西。通过 entityframeworktutorial.net/efcore/… 尝试过有什么建议吗?
-TargetMigration 不起作用,但 -Migration 起作用了,EF Core 5.0.7
M
MaciejLisCK

在 EntityFrameworkCore 中:

Update-Database 20161012160749_AddedOrderToCourse

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


宝石!我花了一段时间才找到这个答案(因为他们已经为 .NET Core 更改了它)。绝对值得一票!
您不需要包含日期/时间。你可以直接输入名字。
这对我不起作用......它会说“完成”,但我指定的迁移之后的所有迁移仍然存在。并且没有执行任何这些迁移中的“Down”代码。
也可以像这样运行回到特定的迁移: Update-Database -Migration: "AddedOrderToCourse" 特别是在迁移名称中使用空格时,这是执行此操作的方法。 (即Update-Database -Migration "Added Order to Course")
Q
QmlnR2F5

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

dotnet ef migrations list
dotnet ef database update NameOfYourMigration

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

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

dotnet ef migrations remove

T
Timtech

解决方案是:

Update-Database –TargetMigration 201609261919239_yourLastMigrationSucess

这在问题中已经说过,提问者已经知道这一点。我看不出这有什么帮助,也许你可以更清楚一点?
这个答案更简洁。泰麦克斯!
f
feli_jane

英孚核心

PM> Update-Database yourMigrationName

(恢复迁移)

PM> Update-Database

为我工作

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


先前的解决方案不适用于 EF Core ,参数错误,而这两个步骤的解决方案有效,在此之后我能够删除迁移,而在收到错误消息之前:迁移 '20210201060139_cascadeDelete' 已应用于数据库.还原它并重试。尝试删除迁移时。尝试。
S
Sean Saúl Astrakhan

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

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

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


这仅适用于尚未在数据库上应用迁移的情况。
m
mattylantz
update-database 0

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


A
Amos

额外提醒:

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

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

L
LCarter

我通过我的 (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]

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


G
Gjaa

英孚核心

将数据库更新到上一点

update-database CategoryIdIsLong

然后,删除不良迁移

remove-migration

C
Chris Halcrow

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

Update-Database 201207211340509_MyMigration -context myDBcontext

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


M
Mojtaba Nava
Update-Database –TargetMigration:"Your migration name"

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

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


A
Alex Dresko

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

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

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


h
hhk

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

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

或者

Update-Database –TargetMigration:Your_Migration_Index -force