当我在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。
Use:
CLI
> . > dotnet ef database update <previous-migration-name> . bat . bat
包管理控制台
PM> Update-Database <previous-migration-name>
例子:
PM>更新数据库MyInitialMigration
然后尝试删除上次迁移。
删除迁移而不更新数据库无法工作,因为您对数据库应用了更改。
如果使用PMC,请尝试:
PM>更新数据库0
这将擦除数据库,并允许您删除解决方案上的迁移快照
一般来说,如果您正在使用Package Manager Console,删除特定迁移的正确方法是引用迁移的名称
Update-Database -Migration {Name of Migration} -Context {context}
另一种删除你根据文档应用的最后一个迁移的方法是使用命令:
dotnet ef migrations remove
这个命令应该从解决方案目录中的开发人员命令提示符(如何打开命令提示符)执行。
例如,如果你的应用程序名为“application”,在文件夹c:\Projects中。那么你的路径应该是:
C:\Projects\Application
要取消应用特定的迁移:
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
删除所有迁移:
只需删除迁移文件夹。
删除最后几个迁移(不是全部):
没有一个命令可以删除一堆迁移,我们不能只删除这几个迁移和它们的*.designer.cs文件,因为我们需要保持快照文件的一致状态。我们需要逐个删除迁移(参见上面删除最后一次迁移)。
取消应用并删除上次迁移:
dotnet ef migrations remove --force
or
PM> Remove-Migration -Force
你需要知道的所有事情的总结
所有命令都将使用dotnet编写。
这个解决方案是为。net Core 3.1提供的,但是也应该与下一个版本兼容
删除迁移:
删除迁移将从项目中删除文件
只有当迁移没有应用到数据库时,才能删除该迁移
然而,
要删除上次创建的迁移:cd to_your_project然后dotnet ef migrations remove
注意:只有在您还没有执行dotnet ef数据库更新或在c#代码中调用database . migrate()时,删除迁移才有效,换句话说,只有在迁移还没有应用到您的数据库时才有效。
取消应用迁移(恢复迁移):
从数据库中删除不需要的更改
不从项目中删除迁移文件,但允许您在取消应用后将其删除
要恢复迁移,您可以:
创建一个新的迁移dotnet ef migrations add <your_changes>并应用它,这是微软推荐的。
或者,使用dotnet ef database update <your_migration_name_to_jump_back_to>将数据库更新为指定的迁移(基本上是取消应用或恢复未选择的迁移)
注意:如果要取消应用的迁移不包含已经在数据库中应用并正在使用的特定列或表,则该列或表将被删除,您的数据将丢失。
在恢复迁移之后,您可以删除不需要的迁移
移除迁移
如果上次迁移没有应用到数据库,则可以删除该迁移。使用下面的remove命令删除最后创建的迁移文件并恢复模型快照。
包管理控制台
点> remove-migration
CLI> dotnet ef迁移删除
上面的命令将删除最后一次迁移,并将模型快照恢复到前一次迁移。请注意,如果迁移已经应用到数据库,那么它将抛出以下异常。
迁移已经应用到数据库。恢复并重试。如果迁移已经应用到其他数据库,请考虑使用新的迁移恢复其更改。
恢复迁移
假设您更改了域类,并使用add-migration命令创建了名为MySecondMigration的第二次迁移,并使用Update命令将此迁移应用到数据库。但是,由于某种原因,您希望将数据库恢复到以前的状态。在这种情况下,使用update-database命令将数据库恢复到指定的先前迁移快照。
包管理控制台
更新数据库MyFirstMigration
CLI
. net ef数据库更新MyFirstMigration。
上面的命令将根据名为MyFirstMigration的迁移恢复数据库,并删除应用于名为MySecondMigration的第二次迁移的所有更改。这也将从数据库中的__efmigrationhistory表中删除MySecondMigration条目。
注意:这不会删除与MySecondMigration相关的迁移文件。使用remove命令将它们从项目中删除。
因为这个问题本身涉及到第一次迁移,所以这个答案适用于任何正在寻找恢复上次迁移的方法的人,因为大多数答案不包括替代场景(对我们大多数人来说,这不是我们的第一次迁移,我们不能抹掉整个迁移历史)。这些命令用于包管理器控制台。
假设你的代码中有以下迁移:
20220110 _initialmigration
20200210 _goodmigration
20200210 _lastgoodmigration
20200210 _badmigration
20200210 _badmigrationagain
如果您已经像问题中那样将迁移应用到db
运行:
Update-Database -Migration <Last_Good_Migration_Name>
注:名称不能有日期前缀。例如:Update-Database -Migration LastGoodMigration
然后删除坏迁移运行:
Remove-Migration
注意:因为我们有两次糟糕的迁移,所以运行两次Remove Migration命令。
如果您还没有将迁移应用到db
运行:
Remove-Migration
在本例中,运行两次Remove Migration命令。
希望这能帮助到一些人。