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



当我使用 EF Core 在 VS2015 中使用 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。

使用:

命令行界面

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

程序包管理器控制台

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

例:

PM> Update-Database MyInitialMigration

然后尝试删除上次迁移。

删除不更新数据库的迁移不起作用,因为已将更改应用于数据库。

如果使用 PMC,请尝试:PM>更新数据库 0这将擦除数据库,并允许您删除 Solution

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

dotnet ef database update 0
dotnet ef migrations remove

要还原上次应用的迁移,您应该:

  1. 从数据库还原迁移:
    • PM> Update-Database <prior-migration-name>
    • PS/cmd> dotnet ef database update <prior-migration-name>
  2. 如果您在Main/Startup中调用dbContext.Database.Migrate()/MigrateAsync():从项目中删除最新的迁移文件(否则将在下一步中再次重新应用(
  3. 更新模型快照:
    • PM> Remove-Migration
    • PS/cmd> dotnet ef migrations remove

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

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

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

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

否则,以下命令将删除迁移并删除迁移文件夹:

PMC 命令:

   > remove-migration -force

命令行命令:

   > dotnet ef migrations remove -f

链接 关于 CLI 命令

关于 PMC 命令的链接

简单地说,您可以按值定位迁移

 Update-Database -Migration:0

然后继续删除它

 Remove-Migration

注意:当您要清除数据库时,这适用于

你需要

知道的一切的摘要

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

此解决方案是为 .net Core 3.1 提供的,但也应与下一个版本兼容。

删除迁移:

  • 删除迁移会从项目中删除该文件
  • 仅当迁移
  • 未应用于数据库时,才能删除迁移还
  • 要删除上次创建的迁移,请执行以下操作: cd to_your_project然后dotnet ef migrations remove

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

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

  • 从数据库中删除不需要的更改
  • 不会从项目中删除迁移文件,但允许您在取消应用后将其删除
  • 要还原迁移,您可以:
    • 创建一个新的迁移dotnet ef migrations add <your_changes>并应用它,这是微软推荐的。
    • 或者,使用dotnet ef database update <your_migration_name_to_jump_back_to>将数据库更新为指定的迁移(基本上是取消应用或还原未选择的迁移(

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

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

在程序包管理器控制台中:

Update-Database Your_Migration_You_Want_To_Revert_To

有关如何还原迁移的更多选项和说明,请参阅此处

要在将

迁移应用于数据库后"取消应用"迁移(最新迁移(,请执行以下操作:

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

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

祝您编码愉快!

通常,如果您使用的是程序包管理器控制台,则删除特定迁移的正确方法是引用迁移的名称

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

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

dotnet ef migrations remove

此命令应从解决方案目录内的开发人员命令提示符(如何打开命令提示符(执行。

例如,如果应用程序位于

名称"应用程序"内,并且位于文件夹 c:\Projects 中。那么你的路径应该是:

C:ProjectsApplication

要还原应用于数据库的所有迁移,只需运行:

update-database 0

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

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

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

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

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

  • 20220110_InitialMigration
  • 20200210_GoodMigration
  • 20200210_LastGoodMigration
  • 20200210_BadMigration
  • 20200210_BadMigrationAgain

如果您已经将迁移应用于数据库,如问题中所示

  1. 跑:

    Update-Database -Migration <Last_Good_Migration_Name>

    注意:名称应不带日期前缀。例如:Update-Database -Migration LastGoodMigration

  2. 然后,要删除错误的迁移运行,请执行以下操作:

    Remove-Migration

    注意:由于我们有两个错误的迁移,因此运行Remove Migration命令两次。

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

只需运行:

Remove-Migration

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

希望这对某人有所帮助。

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

dotnet ef database update {migration_name}

使用要保留更改的迁移的迁移名称。可以使用以下方法找到迁移的名称列表:

dotnet ef migrations list
首先

运行以下命令:

PM>update-database -migration:0

然后运行这个:

PM>remove_migration

完成

删除迁移

如果上次迁移未应用于数据库,则可以将其删除。使用以下删除命令删除上次创建的迁移文件并还原模型快照。

程序包管理器控制台

PM>删除迁移

CLI> dotnet ef migrations remove

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

迁移已应用于数据库。将其还原,然后重试。如果迁移已应用于其他数据库,请考虑使用新迁移还原其更改。

还原迁移

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

程序包管理器控制台

PM> 更新数据库 MyFirstMigration

命令行界面

dotnet ef database update MyFirstMigration.

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

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

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

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

基于问题:

Update-Database -Migration <previous-migration-name> -context BloggingContext
<</div> div class="one_answers">

1.查找表 "dbo._EFMigrationsHistory",然后删除要删除的迁移记录。2. 在 PM(程序包管理器控制台(中运行"删除迁移"。为我工作。

最新更新