当我在 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
利用:
命令行界面
> 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 0
dotnet ef migrations remove
dotnet ef database update 0
,但之后运行 dotnet ef migrations remove
将删除 Identity 的默认迁移,这可能是不希望的。
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.
要取消应用特定迁移:
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
Migrations
的文件夹并在我的包管理器控制台中运行上述命令时,如果此答案能说明预期结果,那将非常有用。例如,删除是否会影响 Migrations 文件夹的内容?也就是说,应该删除 Add-Migration
产生的文件,还是保留它们并且我需要手动删除它们?谢谢!
要恢复上次应用的迁移,您应该(包管理器控制台命令):
从数据库恢复迁移:PM> Update-Database
UPD:最新版本的 Visual Studio (2017) 似乎不需要第二步。
Remove-Migration
后自动删除,没有问题。我不确定您所说的“它将在下一步重新应用”!
dbContext.Database.Migrate()
时才需要第二步
您仍然可以使用 Update-Database
命令。
Update-Database -Migration <migration name> -Context <context name>
但是,从您的迁移名称来看,我假设这是第一次迁移,因此该命令可能不起作用。您应该能够从数据库的 __MigrationHistory
表中删除条目,然后再次运行 Remove-Migration
命令。您也可以删除迁移文件并重新开始。
Update-Database
或从项目目录的命令提示符调用 dotnet ef database update
。
<migration name>
应该是您想要返回的迁移的名称(即可能是迁移之前你搞砸的迁移),不是您要撤消的迁移的名称。
您应该从“_EFMigrationsHistory”表中删除迁移“20160703192724_MyFirstMigration”记录。
否则下面的命令将删除迁移并删除迁移文件夹:
PMC 命令:
> remove-migration -force
CLI 命令:
> dotnet ef migrations remove -f
您只需按价值定位迁移
Update-Database -Migration:0
然后继续删除它
Remove-Migration
注意这是在您想要清除数据库时使用的。
在包管理器控制台中:
Update-Database Your_Migration_You_Want_To_Revert_To
More options and explanation on how to revert migrations can be seen here
在已将其应用于数据库之后“取消应用”最新(最近?)迁移:
打开 SQL Server 对象资源管理器(查看 ->“SQL Server 对象资源管理器”)通过将小三角形展开到侧面,导航到链接到您的项目的数据库。展开“表”找到名为“dbo._EFMigrationsHistory”的表。右键单击它并选择“查看数据”以查看 Visual Studio 中的表条目。删除与您要取消应用的迁移对应的行(如果出现提示,请对警告说“是”)。在包含 project.json 文件的目录中的命令窗口中再次运行“dotnet ef migrations remove”。或者,在包管理器控制台中运行“Remove-Migration”命令。
希望这会有所帮助并适用于项目中的任何迁移...我仅对最近的迁移进行了测试...
快乐编码!
一般来说,如果您使用包管理器控制台,删除特定迁移的正确方法是引用迁移的名称
Update-Database -Migration {Name of Migration} -Context {context}
另一种删除您根据 docs 应用的上次迁移的方法是使用以下命令:
dotnet ef migrations remove
此命令应从解决方案目录中的开发人员命令提示符 (how to open command prompt) 执行。
例如,如果您的应用程序在名称“Application”内并且位于文件夹 c:\Projects 中。那么你的路径应该是:
C:\Projects\Application
要恢复应用于 DB 的所有迁移,只需运行:
update-database 0
运行 Remove-Migration
的次数应与 Migration 目录中可见的迁移文件一样多。该命令会删除最新的迁移并更新快照。
dotnet ef database update <the-migration-you-want-to-recover>
dotnet ef migrations remove
不要忘记 remove-Call,因为这将为您删除迁移文件并更新快照文件。
database remove
还是您的意思是 migrations remove
?
我不明白为什么我们在这里混淆了事情。所以我会写一个清晰的解释,以及你需要注意的地方。
所有命令都将使用 dotnet
编写。
此解决方案是为 .net Core 3.1 提供的,但也应与所有其他代兼容
删除迁移:
删除迁移会从您的项目中删除文件(每个人都应该清楚)
如果迁移尚未应用于数据库,则只能删除迁移
要删除最后创建的迁移: cd to_your_project 然后 dotnet ef migrations remove
注意:仅当您尚未执行 dotnet ef database update
或在您的 c# 代码中调用 Database.Migrate()
时,移除迁移才有效,换句话说,只有当迁移尚未应用于您的数据库时。
取消应用迁移(还原迁移):
从数据库中删除不需要的更改
不会从您的项目中删除迁移文件,但允许您在取消应用后将其删除
要恢复迁移,您可以: 创建一个新的迁移 dotnet ef migrations add
创建一个新的迁移 dotnet ef migrations add
或者,使用 dotnet ef database update
注意:如果您要取消应用的迁移不包含特定的列或表,而这些列或表已在您的数据库中应用并正在使用,则该列或表将被删除,您的数据将丢失。
还原迁移后,您可以删除不需要的迁移
首先运行以下命令:
PM>update-database -migration:0
然后运行这个:
PM>remove_migration
结束
要在 EF Core 1.0 中取消应用迁移,请使用以下命令:
dotnet ef 数据库更新 {migration_name}
使用您希望保留更改的迁移的迁移名称。可以使用以下命令找到迁移的名称列表:
dotnet ef 迁移列表
删除迁移
如果上次迁移未应用于数据库,您可以删除它。使用以下删除命令删除最后创建的迁移文件并恢复模型快照。
包管理器控制台
PM> 移除迁移
CLI> dotnet ef 迁移删除
上述命令将删除上一次迁移并将模型快照恢复为上一次迁移。请注意,如果迁移已应用于数据库,则会引发以下异常。
迁移已应用于数据库。还原它并重试。如果迁移已应用于其他数据库,请考虑使用新迁移恢复其更改。
恢复迁移
假设您更改了域类并使用 add-migration 命令创建了名为 MySecondMigration 的第二个迁移,并使用 Update 命令将此迁移应用于数据库。但是,出于某种原因,您希望将数据库恢复到以前的状态。在这种情况下,请使用 update-database 命令将数据库恢复到指定的先前迁移快照。
包管理器控制台
PM> 更新数据库 MyFirstMigration
命令行界面
dotnet ef 数据库更新 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
由于问题本身涉及第一次迁移,因此此答案适用于在这里寻找恢复上次迁移的方法的任何人,因为大多数答案不涵盖替代方案(对于我们大多数人来说,这不是我们的第一次迁移,我们无法擦除整个迁移历史)。这些命令适用于包管理器控制台。
假设您的代码中有以下迁移:
20220110_InitialMigration
20200210_GoodMigration
20200210_LastGoodMigration
20200210_BadMigration
20200210_BadMigrationAgain
如果您已经像问题中那样将迁移应用到数据库
运行:Update-Database -Migration
如果您尚未将迁移应用到数据库
赶紧跑:
Remove-Migration
在我们的例子中,运行 Remove Migration
命令两次。
希望这可以帮助某人。
1.找到表“dbo._EFMigrationsHistory”,然后删除要删除的迁移记录。 2. 在 PM(Package Manager Console) 中运行“remove-migration”。为我工作。
你可以这样做:
dotnet ef migrations remove
警告
注意不要删除任何已应用于生产数据库的迁移。不这样做会阻止您恢复它,并且可能会破坏后续迁移所做的假设。
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