如何在ASP中取消应用迁移。NET Core与EF Core

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

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更新3。

415835 次浏览

使用:

CLI

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

包管理控制台

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

例子:

PM> Update-Database MyInitialMigration

然后尝试删除上次迁移。

删除迁移而不更新数据库无法工作,因为您对数据库应用了更改。

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

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

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

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

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

dotnet ef database update 0
dotnet ef migrations remove

在迁移已经应用到数据库后“取消”最近的迁移:

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

希望这有助于并适用于项目中的任何迁移…我只测试了最近的迁移…

编码快乐!

一般来说,如果您正在使用Package Manager Console,删除特定迁移的正确方法是引用迁移的名称

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

根据文档删除最后一次迁移的另一种方法是使用命令:

dotnet ef migrations remove

这个命令应该在解决方案目录中的开发人员命令提示符(如何打开命令提示符)中执行。

例如,如果你的应用程序名为“application”,在文件夹c:\Projects中。那么你的路径应该是:

C:\Projects\Application

为了在EF Core 1.0中取消迁移,使用以下命令:

dotnet ef database update {migration_name}

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

dotnet ef migrations list

在包管理器控制台:

Update-Database Your_Migration_You_Want_To_Revert_To

更多关于如何恢复迁移的选项和解释可以在这里看到

简单地说,您可以通过值来确定迁移的目标

 Update-Database -Migration:0

然后继续并删除它

 Remove-Migration

请注意这是当你想清除数据库。

< p > 1。找到表“dbo”。_efmigrationshhistory”,然后删除要删除的迁移记录。 2. 在PM(包管理控制台)运行“remove-migration”。

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

  1. 从数据库:PM> Update-Database <prior-migration-name>恢复迁移
  2. 从项目中删除迁移文件(否则将在下一步中再次应用)
  3. 更新模型快照:PM> Remove-Migration
< p > 乌利希期刊指南: 在Visual Studio(2017)的最新版本中,第二步似乎不需要

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

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

PMC命令:

   > remove-migration -force

CLI命令:

   > dotnet ef migrations remove -f

CLI命令链接

PMC命令Link About PMC Commands . .

取消应用特定的迁移:

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

首先执行以下命令:

PM>update-database -migration:0

然后运行这个:

PM>remove_migration

完成

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

update-database 0

在migration目录中有可见的迁移文件时,应该多次运行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>将数据库更新为指定的迁移(基本上是取消应用或恢复未选择的迁移)

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

在恢复迁移之后,您可以删除不需要的迁移

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

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

移除迁移

如果上次迁移没有应用到数据库,则可以删除该迁移。使用下面的remove命令删除最后创建的迁移文件并恢复模型快照。

包管理控制台

PM>remove-migration

CLI>dotnetef迁移删除

上面的命令将删除最后一次迁移,并将模型快照恢复到前一次迁移。请注意,如果迁移已经应用到数据库,那么它将抛出以下异常。

迁移已经应用到数据库。恢复并重试。如果迁移已经应用到其他数据库,请考虑使用新的迁移恢复其更改。

恢复迁移

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

包管理控制台

PM>- database就MyFirstMigration

CLI

. net ef数据库更新MyFirstMigration。

上面的命令将根据名为MyFirstMigration的迁移恢复数据库,并删除应用于名为MySecondMigration的第二次迁移的所有更改。这也将从数据库中的__efmigrationhistory表中删除MySecondMigration条目。

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

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

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

基于问题:

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

因为这个问题本身涉及到第一次迁移,所以这个答案适用于任何正在寻找恢复上次迁移的方法的人,因为大多数答案不包括替代场景(对我们大多数人来说,这不是我们的第一次迁移,我们不能抹掉整个迁移历史)。这些命令用于包管理器控制台。

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

  • 20220110 _initialmigration
  • 20200210 _goodmigration
  • 20200210 _lastgoodmigration
  • 20200210 _badmigration
  • 20200210 _badmigrationagain

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

  1. < p >运行:

    Update-Database -Migration <Last_Good_Migration_Name>

    注:名称不能有日期前缀。例如:Update-Database -Migration LastGoodMigration

  2. 然后删除坏迁移运行:

    Remove-Migration

    注意:因为我们有两次错误的迁移,所以运行Remove Migration命令两次。

如果您还没有将迁移应用到db

运行:

Remove-Migration

在本例中,运行Remove Migration命令两次。

希望这能帮助到一些人。