如何使用 EF Core 在 ASP.NET Core 中取消应用迁移
本文关键字:Core 取消 应用 迁移 NET ASP 何使用 EF | 更新日期: 2023-09-27 17:54:34
当我使用 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 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
要完全删除所有迁移并重新开始,请执行以下操作:
dotnet ef database update 0
dotnet ef migrations remove
要还原上次应用的迁移,您应该:
- 从数据库还原迁移:
-
PM> Update-Database <prior-migration-name>
-
PS/cmd> dotnet ef database update <prior-migration-name>
-
- 如果您在
Main
/Startup
中调用dbContext.Database.Migrate()
/MigrateAsync()
:从项目中删除最新的迁移文件(否则将在下一步中再次重新应用( - 更新模型快照:
-
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 对象资源管理器
- (视图 ->"SQL Server 对象资源管理器"(
- 通过将小三角形向侧面展开来导航到链接到项目的数据库。
- 展开"表">
- 找到名为"dbo._EFMigrationsHistory"的表。
- 右键单击它并选择"查看数据"以查看Visual Studio中的表条目。
- 删除要取消应用的与迁移对应的行(如果出现提示,对警告说"是"(。
- 在命令窗口中具有 project.json 文件的目录中再次运行"dotnet ef migrations remove"。或者,在包管理器控制台中运行"删除迁移"命令。
希望这有所帮助,并且适用于项目中的任何迁移...我只对最近的迁移进行了测试......
祝您编码愉快!
通常,如果您使用的是程序包管理器控制台,则删除特定迁移的正确方法是引用迁移的名称
Update-Database -Migration {Name of Migration} -Context {context}
根据文档删除上次应用的迁移的另一种方法是使用以下命令:
dotnet ef migrations remove
此命令应从解决方案目录内的开发人员命令提示符(如何打开命令提示符(执行。
例如,如果应用程序位于名称"应用程序"内,并且位于文件夹 c:''Projects 中。那么你的路径应该是:
C:'Projects'Application
要还原应用于数据库的所有迁移,只需运行:
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
如果您已经将迁移应用于数据库,如问题中所示
跑:
Update-Database -Migration <Last_Good_Migration_Name>
注意:名称应不带日期前缀。例如:
Update-Database -Migration LastGoodMigration
然后,要删除错误的迁移运行,请执行以下操作:
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="answers"> 1.查找表 "dbo._EFMigrationsHistory",然后删除要删除的迁移记录。2. 在 PM(程序包管理器控制台(中运行"删除迁移"。为我工作。