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

nam*_*nam 139 c# entity-framework-core visual-studio-2015 .net-core asp.net-core

当我PM> Remove-Migration -context BloggingContext使用EF Core在VS2015中运行ASP.NET 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.
Run Code Online (Sandbox Code Playgroud)

我怎么能取消申请呢?我正在使用最新版本的ASP.NET Core 1.0,EF Core和VS2015 Update 3.

ade*_*lin 166

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

然后尝试删除上次迁移.

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

  • 您需要在"MyFirstMigration"之前更新到迁移.如果这是第一次迁移(顾名思义),那么您可以使用`dotnet ef database update 0`从数据库中恢复(取消应用)所有迁移.然后你应该能够运行`dotnet ef migrations remove`. (11认同)
  • 我仍然得到同样的错误.我首先使用了成功运行的`dotnet ef数据库更新MyFirstMigration --context BloggingContext`.然后我运行了`dotnet ef migrations remove --context BloggingContext`,它给了我与我帖子中相同的错误消息 (5认同)
  • 另外值得注意的是,您应该只使用迁移的名称,不包括日期前缀 (2认同)
  • 之后调用`dotnet ef migrations remove`。 (2认同)

Ron*_*mos 103

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

dotnet ef database update 0
dotnet ef migrations remove
Run Code Online (Sandbox Code Playgroud)

  • @nam “但您不想删除所有迁移。” 但我们中的一些人确实如此。不要假设我想要什么:) (5认同)
  • 但您不想删除所有迁移。例如,您希望在 Data\Migrations 文件夹下保留 VS 为身份(用户帐户)创建的默认迁移。 (3认同)
  • 很高兴知道 `dotnet ef database update 0`,但是之后运行 `dotnet ef migrations remove` 将删除 Identity 的默认迁移,这可能不是我们想要的。 (2认同)
  • 这不适合我.第一行是正确的并删除所有迁移,在第二行我仍然得到'迁移'20180618103514_InitialMigration'已经应用于数据库.还原它然后再试一次.如果迁移已应用于其他数据库,请考虑使用新迁移还原其更改 (2认同)

Bra*_*rad 49

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

Update-Database -Migration <migration name> -Context <context name>
Run Code Online (Sandbox Code Playgroud)

但是,根据您的迁移名称判断,我认为这是第一次迁移,因此该命令可能无法正常工作.您应该能够从__MigrationHistory数据库中的表中删除该条目,然后Remove-Migration再次运行该命令.您也可以删除迁移文件,然后重新开始.

  • 只是为了澄清布拉德在这里的答案 - "<migration name>"应该是你想要*回到*的迁移的名称(即可能是你之前搞砸的那个迁移*),而不是迁移你的名字想撤消. (5认同)

Dmi*_*nov 24

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

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

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

  • 谢谢你!这非常有效,令人着迷的是,在所有解决方案中,没有人提到需要执行步骤 2。 (4认同)

Joh*_*ngi 22

您只需按值定位迁移即可

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

然后继续删除它

 Remove-Migration
Run Code Online (Sandbox Code Playgroud)

  • 注意:-Migration:0 表示返回没有迁移的状态。这将清除您的数据库 (4认同)

Oma*_*mar 20

您需要了解的所有内容的摘要

所有命令都将使用 编写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>

注意:如果您选择反转迁移,但所涉及的特定列或表已存在并正在数据库中使用,则此操作将完全删除该列或表。因此,您将丢失其中存储的所有数据。

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


Alb*_*rtK 18

取消应用特定迁移

dotnet ef database update <previous-migration-name>
or
PM> Update-Database -Migration <previous-migration-name>
Run Code Online (Sandbox Code Playgroud)

要取消应用所有迁移

dotnet ef database update 0
or
PM> Update-Database -Migration 0
Run Code Online (Sandbox Code Playgroud)

要删除上一次迁移:

dotnet ef migrations remove
or
PM> Remove-Migration
Run Code Online (Sandbox Code Playgroud)

要取消应用并删除上一次迁移,请执行以下操作:

dotnet ef migrations remove --force
or
PM> Remove-Migration -Force
Run Code Online (Sandbox Code Playgroud)

  • 在我的 Visual Studio IDE 中查看名为“Migrations”的文件夹,并在我的包管理器控制台中运行上述命令时,如果这个答案能够说明预期的结果,那将非常有用。例如,删除是否会影响 Migrations 文件夹的内容?也就是说,应该删除“添加迁移”产生的文件,还是保留它们并且我需要手动删除它们?谢谢! (2认同)

小智 13

在已经应用于数据库之后,"取消应用"最多(最近的?)迁移:

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

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

快乐的编码!

  • 这实际上不会应用迁移,只是让框架"思考"它尚未应用.如果执行此操作,您的数据库将处于不一致状态. (16认同)
  • 手动编辑 __EFMigrationsHistory 中的数据是一个糟糕的建议。不要这样做。该表仅供迁移工具在幕后使用。如果您开始手动编辑数据,一个错误就可能在您的项目中造成各种疯狂的意外行为。使用其他推荐的解决方案之一是一个更好的主意。 (3认同)

Cha*_*lie 10

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

这些命令适用于包管理器控制台

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

  • 20220110_初始迁移
  • 20200210_好迁移
  • 20200210_最后的好迁移
  • 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命令两次。

希望这对某人有帮助。

2023 年 8 月更新

如果您有多个数据库上下文,请添加-Context Context_Name到每个命令。例如: Remove-Migration -Context MyDbContext


小智 9

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

dotnet ef database update {migration_name}
Run Code Online (Sandbox Code Playgroud)

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

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


Dre*_*kis 8

在包管理器控制台中:

Update-Database Your_Migration_You_Want_To_Revert_To

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


Khe*_*der 8

dotnet ef database update <the-migration-you-want-to-recover>
dotnet ef migrations remove
Run Code Online (Sandbox Code Playgroud)

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


Ana*_*nis 7

通常,如果您使用的是Package Manager控制台,则删除特定迁移的正确方法是引用迁移名称

Update-Database -Migration {Name of Migration} -Context {context}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

C:\Projects\Application
Run Code Online (Sandbox Code Playgroud)

  • 问题是如果“dotnet efmigrationsremove”返回错误“迁移已应用于数据库”该怎么办 (2认同)

Ami*_*lle 6

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

否则,此命令将删除“迁移”并删除“迁移文件夹”:

   > remove-migration -force
Run Code Online (Sandbox Code Playgroud)

  • -force 对我有用:) (2认同)

Dip*_*aul 5

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

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

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