ChatGPT解决这个技术问题 Extra ChatGPT

如何使用 EF Core 在 ASP.NET Core 中取消应用迁移

当我在 VS2015 中使用 EF Core 的 ASP.NET Core 项目运行 PM> Remove-Migration -context BloggingContext 时,我收到以下错误:

System.InvalidOperationException: The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.    at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.RemoveMigration(String projectDir, String rootNamespace, Boolean force) 
    at Microsoft.EntityFrameworkCore.Design.MigrationsOperations.RemoveMigration(String contextType, Boolean force) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.MigrationsRemoveCommand.<>c__DisplayClass0_0.<Configure>b__0() 
    at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String[] args) 
 The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.

如何取消申请?我正在使用最新版本的 ASP.NET Core 1.0、EF Core 和 VS2015 Update 3。

尝试在末尾添加 -force
文章 learnentityframeworkcore.com/migrations#reversing-a-migration 描述了这些步骤。感谢@drewskis提供链接

C
Community

利用:

命令行界面

> dotnet ef database update <previous-migration-name>

包管理器控制台

PM> Update-Database <previous-migration-name>

例子:

PM> Update-Database MyInitialMigration

然后尝试删除上次迁移。

在没有数据库更新的情况下删除迁移不起作用,因为您将更改应用于数据库。

如果使用 PMC,请尝试: PM> update-database 0 这将擦除数据库并允许您删除解决方案上的迁移快照


我仍然遇到同样的错误。我第一次使用成功的 dotnet ef database update MyFirstMigration --context BloggingContext。然后我运行 dotnet ef migrations remove --context BloggingContext,它给了我与我的帖子中相同的错误消息
您需要在 MyFirstMigration 之前更新到迁移。如果这是第一次迁移(顾名思义),那么您可以使用 dotnet ef database update 0 从数据库中恢复(取消应用)所有迁移。然后您应该能够运行 dotnet ef migrations remove
另外值得注意的是,您应该只使用迁移的名称,不包括日期前缀
在此之后调用 dotnet ef migrations remove
您的第二个陈述:“然后尝试删除上次迁移”在此答案中不完整,请准确说出您的意思。删除迁移文件?执行命令? ...
R
Ronald Ramos

要完全删除所有迁移并重新开始,请执行以下操作:

dotnet ef database update 0
dotnet ef migrations remove

但是您不想删除所有迁移。例如,您希望保留 VS 在 Data\Migrations 文件夹下为身份(用户帐户)创建的默认迁移。
很高兴知道 dotnet ef database update 0,但之后运行 dotnet ef migrations remove 将删除 Identity 的默认迁移,这可能是不希望的。
@nam “但是您不想删除所有迁移。”但我们中的一些人这样做。不要假设我想要什么:)
这对我不起作用。第一行没问题并删除所有迁移,在第二行我仍然得到 The migration '20180618103514_InitialMigration' has already been applied to the database. Revert it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.
@ShimmyWeitzhandler 是的。 stackoverflow.com/a/55323154/109941
A
AlbertK

要取消应用特定迁移:

dotnet ef database update LastGoodMigrationName
or
PM> Update-Database -Migration LastGoodMigrationName

要取消应用所有迁移:

dotnet ef database update 0
or
PM> Update-Database -Migration 0

要删除上次迁移:

dotnet ef migrations remove
or
PM> Remove-Migration

要删除所有迁移:

只需删除 Migrations 文件夹。

要删除最后几次迁移(不是全部):

没有删除大量迁移的命令,我们不能只删除这几个 migrations 及其 *.designer.cs 文件,因为我们需要使快照文件保持一致状态。我们需要一个一个地移除迁移(参见上面的To remove last migration)。

要取消应用和删除上次迁移:

dotnet ef migrations remove --force
or
PM> Remove-Migration -Force

我一直在这些帖子中看到unapply这个词。它只是打动了我这不是一个技术术语,而是这个词 un - apply
我想知道“向下”的方法是什么?
在我的 Visual Studio IDE 中查看名为 Migrations 的文件夹并在我的包管理器控制台中运行上述命令时,如果此答案能说明预期结果,那将非常有用。例如,删除是否会影响 Migrations 文件夹的内容?也就是说,应该删除 Add-Migration 产生的文件,还是保留它们并且我需要手动删除它们?谢谢!
dotnet ef migrations remove --force 在 ef core 中为我工作
@Pajri Aprilio 删除迁移时,“向下”部分列出了撤消所述迁移所需的步骤。
D
Dmitry Polomoshnov

要恢复上次应用的迁移,您应该(包管理器控制台命令):

从数据库恢复迁移:PM> Update-Database 从项目中删除迁移文件(或者将在下一步重新应用)更新模型快照:PM> Remove-Migration

UPD:最新版本的 Visual Studio (2017) 似乎不需要第二步。


谢谢!这非常有效,令人着迷的是,在所有解决方案中,没有人提到过第 2 步的必要性。
是的,没有人提到第二步。谢谢
不确定第二步,在我的情况下(最新的 VS2017)迁移文件将在调用 Remove-Migration 后自动删除,没有问题。我不确定您所说的“它将在下一步重新应用”!
@S.Serpooshan 确实。我手动删除了它,但是当我运行 Remove-Migration 时,它抱怨我之前的迁移已应用于数据库。但是,它有效。
我认为只有在您的 startup.cs 中调用 dbContext.Database.Migrate() 时才需要第二步
B
Brad

您仍然可以使用 Update-Database 命令。

Update-Database -Migration <migration name> -Context <context name>

但是,从您的迁移名称来看,我假设这是第一次迁移,因此该命令可能不起作用。您应该能够从数据库的 __MigrationHistory 表中删除条目,然后再次运行 Remove-Migration 命令。您也可以删除迁移文件并重新开始。


您可以从包管理控制台调用 Update-Database 或从项目目录的命令提示符调用 dotnet ef database update
只是为了澄清 Brad 的回答 - <migration name> 应该是您想要返回的迁移的名称(即可能是迁移之前你搞砸的迁移),不是您要撤消的迁移的名称。
A
Amin Golmahalle

您应该从“_EFMigrationsHistory”表中删除迁移“20160703192724_MyFirstMigration”记录。

否则下面的命令将删除迁移并删除迁移文件夹:

PMC 命令:

   > remove-migration -force

CLI 命令:

   > dotnet ef migrations remove -f

Link About CLI Commands

Link About PMC Commands


J
John Nyingi

您只需按价值定位迁移

 Update-Database -Migration:0

然后继续删除它

 Remove-Migration

注意这是在您想要清除数据库时使用的。


这对我有用,但我将 EF 和 .NET core 2.0 与 VS2017 一起使用
注意:-Migration:0 意味着回到没有迁移的状态。这将清除您的数据库
是的,根据所问的问题。您可以根据要回滚到的迁移来增加值
在 .Net Core 3.1 中工作
D
Drewskis

在包管理器控制台中:

Update-Database Your_Migration_You_Want_To_Revert_To

More options and explanation on how to revert migrations can be seen here


有用的链接,应该是问题的评论
这就是您要在 .NET 核心中使用的内容
O
Ole K

在已将其应用于数据库之后“取消应用”最新(最近?)迁移:

打开 SQL Server 对象资源管理器(查看 ->“SQL Server 对象资源管理器”)通过将小三角形展开到侧面,导航到链接到您的项目的数据库。展开“表”找到名为“dbo._EFMigrationsHistory”的表。右键单击它并选择“查看数据”以查看 Visual Studio 中的表条目。删除与您要取消应用的迁移对应的行(如果出现提示,请对警告说“是”)。在包含 project.json 文件的目录中的命令窗口中再次运行“dotnet ef migrations remove”。或者,在包管理器控制台中运行“Remove-Migration”命令。

希望这会有所帮助并适用于项目中的任何迁移...我仅对最近的迁移进行了测试...

快乐编码!


这实际上不会取消应用迁移,只是让框架“认为”它尚未应用。如果您这样做,您的数据库将处于不一致的状态。
手动编辑 __EFMigrationsHistory 中的数据是一个糟糕的建议。不要这样做。该表仅供迁移工具在后台使用。如果您开始手动编辑数据,一个错误可能会在您的项目中产生各种疯狂的意外行为。使用其他推荐的解决方案之一是一个更好的主意。
我们遇到过这样一种情况,一名初级团队成员对切换分支感到困惑,并最终从两者中手动删除了迁移(尽管它仍然在 __EFMigrationsHistory 表中,因为它已经应用了),所以我们失去了“down”。这就是我们最终不得不做的事情,加上 SSMS 中的一些手动反转。所以不要这样做——除非你此时别无选择。至少他所做的只是添加了一个新字段。
A
Anastasios Selmani

一般来说,如果您使用包管理器控制台,删除特定迁移的正确方法是引用迁移的名称

Update-Database -Migration {Name of Migration} -Context {context}

另一种删除您根据 docs 应用的上次迁移的方法是使用以下命令:

dotnet ef migrations remove

此命令应从解决方案目录中的开发人员命令提示符 (how to open command prompt) 执行。

例如,如果您的应用程序在名称“Application”内并且位于文件夹 c:\Projects 中。那么你的路径应该是:

C:\Projects\Application

问题是如果“dotnet ef migrations remove”返回错误“迁移已应用于数据库”该怎么办
D
Dipendu Paul

要恢复应用于 DB 的所有迁移,只需运行:

update-database 0

运行 Remove-Migration 的次数应与 Migration 目录中可见的迁移文件一样多。该命令会删除最新的迁移并更新快照。


R
Ruben Veldman
dotnet ef database update <the-migration-you-want-to-recover>
dotnet ef migrations remove

不要忘记 remove-Call,因为这将为您删除迁移文件并更新快照文件。


您的意思是真的 database remove 还是您的意思是 migrations remove
m
mickmackusa

我不明白为什么我们在这里混淆了事情。所以我会写一个清晰的解释,以及你需要注意的地方。

所有命令都将使用 dotnet 编写。

此解决方案是为 .net Core 3.1 提供的,但也应与所有其他代兼容

删除迁移:

删除迁移会从您的项目中删除文件(每个人都应该清楚)

如果迁移尚未应用于数据库,则只能删除迁移

要删除最后创建的迁移: cd to_your_project 然后 dotnet ef migrations remove

注意:仅当您尚未执行 dotnet ef database update 或在您的 c# 代码中调用 Database.Migrate() 时,移除迁移才有效,换句话说,只有当迁移尚未应用于您的数据库时。

取消应用迁移(还原迁移):

从数据库中删除不需要的更改

不会从您的项目中删除迁移文件,但允许您在取消应用后将其删除

要恢复迁移,您可以: 创建一个新的迁移 dotnet ef migrations add 并应用它,这是 microsoft 推荐的。或者,使用 dotnet ef database update 将数据库更新到指定的迁移(基本上是取消应用或还原未选择的迁移)

创建一个新的迁移 dotnet ef migrations add 并应用它,这是微软推荐的。

或者,使用 dotnet ef database update 将数据库更新到指定的迁移(基本上是取消应用或还原未选择的迁移)

注意:如果您要取消应用的迁移不包含特定的列或表,而这些列或表已在您的数据库中应用并正在使用,则该列或表将被删除,您的数据将丢失。

还原迁移后,您可以删除不需要的迁移


在您的最后一条注释中,我想您想说:“如果您在取消应用迁移后想要进行的目标迁移不包含...”或“如果您想要取消应用的迁移不包含包含”
R
Rajan Sharma

首先运行以下命令:

PM>update-database -migration:0

然后运行这个:

PM>remove_migration

结束


R
Rufus Lobo

要在 EF Core 1.0 中取消应用迁移,请使用以下命令:

dotnet ef 数据库更新 {migration_name}

使用您希望保留更改的迁移的迁移名称。可以使用以下命令找到迁移的名称列表:

dotnet ef 迁移列表


s
shayar shrestha

删除迁移

如果上次迁移未应用于数据库,您可以删除它。使用以下删除命令删除最后创建的迁移文件并恢复模型快照。

包管理器控制台

PM> 移除迁移

CLI> dotnet ef 迁移删除

上述命令将删除上一次迁移并将模型快照恢复为上一次迁移。请注意,如果迁移已应用于数据库,则会引发以下异常。

迁移已应用于数据库。还原它并重试。如果迁移已应用于其他数据库,请考虑使用新迁移恢复其更改。

恢复迁移

假设您更改了域类并使用 add-migration 命令创建了名为 MySecondMigration 的第二个迁移,并使用 Update 命令将此迁移应用于数据库。但是,出于某种原因,您希望将数据库恢复到以前的状态。在这种情况下,请使用 update-database 命令将数据库恢复到指定的先前迁移快照。

包管理器控制台

PM> 更新数据库 MyFirstMigration

命令行界面

dotnet ef 数据库更新 MyFirstMigration。

上述命令将基于名为 MyFirstMigration 的迁移还原数据库,并删除应用于名为 MySecondMigration 的第二个迁移的所有更改。这还将从数据库中的 __EFMigrationsHistory 表中删除 MySecondMigration 条目。

注意:这不会删除与 MySecondMigration 相关的迁移文件。使用删除命令将它们从项目中删除。


M
Majid M.

因为我已被重定向到此问题以在 ef 而不是 ef core 中搜索回滚迁移,所以我将这个答案添加到每个想了解 ef 中相同问题的人的问题中。如果您使用 ef,则可以使用以下命令回滚迁移:

Update-Database [[-Migration] <String>] 
                [-Context <String>]
                [-Project <String>]
                [-StartupProject <String>] 
                [<CommonParameters>] 

基于问题:

Update-Database -Migration <previous-migration-name> -context BloggingContext

C
Charlie

由于问题本身涉及第一次迁移,因此此答案适用于在这里寻找恢复上次迁移的方法的任何人,因为大多数答案不涵盖替代方案(对于我们大多数人来说,这不是我们的第一次迁移,我们无法擦除整个迁移历史)。这些命令适用于包管理器控制台。

假设您的代码中有以下迁移:

20220110_InitialMigration

20200210_GoodMigration

20200210_LastGoodMigration

20200210_BadMigration

20200210_BadMigrationAgain

如果您已经像问题中那样将迁移应用到数据库

运行:Update-Database -Migration 注意:名称应该没有日期前缀。例如:Update-Database -Migration LastGoodMigration 然后删除错误的迁移运行:Remove-Migration 注意:由于我们有两个错误的迁移,请运行两次删除迁移命令。

如果您尚未将迁移应用到数据库

赶紧跑:

Remove-Migration

在我们的例子中,运行 Remove Migration 命令两次。

希望这可以帮助某人。


A
Atom

1.找到表“dbo._EFMigrationsHistory”,然后删除要删除的迁移记录。 2. 在 PM(Package Manager Console) 中运行“remove-migration”。为我工作。


这将导致数据库的状态不一致(例如,列已被删除)
C
Cleptus

你可以这样做:

dotnet ef migrations remove

警告

注意不要删除任何已应用于生产数据库的迁移。不这样做会阻止您恢复它,并且可能会破坏后续迁移所做的假设。


请不要重复答案,它没有用。 stackoverflow.com/a/55323154/861716

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅