entity framework回滚并删除错误的迁移

我正在使用EF 6.0在C#中使用手动迁移和更新的项目。 我在数据库上有大约5次迁移,但是我意识到最后一次迁移是坏的,我不想要它。 我知道我可以回滚到以前的迁移,但是当我添加一个新的(固定的)迁移并运行Update-Database时,即使是错误的迁移也会被应用。

我试图回滚到以前的迁移,并删除具有不良迁移的文件。 但是,当我尝试添加新的迁移时,在更新数据库时出现错误,因为迁移文件已损坏(更具体地说,第一行代码将表A重命名为B,然后是下一行,EF正试图用名字A – 也许这是一些EF错误)。

是否有一些查询我可以运行,这将告诉EF像“忘记最后一次迁移像它从来没有存在,这是不好的”? 像删除迁移。

编辑1我find适合我的解决scheme。 将模型更改为良好状态并运行Add-Migration TheBadMigration -Force 。 这将重新构build最后的,而不是应用的迁移。

无论如何,这还不能完全回答原来的问题。 如果我UpdateDatabase的错误迁移,我没有find好的方式如何回滚和创build新的迁移,不包括坏的。

谢谢

你有2个选项:

  • 您可以从错误迁移中将Down删除,并将其置于新的迁移中(您还需要对模型进行后续更改)。 这实际上是一个更好的版本。

    对于已经进入多个环境的东西,我使用这个选项。

  • 另一个select是根据您部署的数据库实际运行Update-Database –TargetMigration: TheLastGoodMigration ,然后从您的解决scheme中删除迁移。 这是一个绿巨人粉碎替代品,并要求这是针对任何部署了坏版本的数据库执行。

    注意:要重新迁移迁移,您可以使用Add-Migration [existingname] -Force 。 但是,这会覆盖您现有的迁移,因此只有在您从数据库中删除现有迁移的情况下才能执行此操作。 这与删除现有的迁移文件并运行add-migration

    我在开发时使用这个选项。

正如问题所示,这适用于尚未发布的发展型环境中的迁移。

这个问题可以分两步解决,第一步是将数据库恢复到最后一次良好的迁移,然后从Entity Framework项目中删除不良的迁移。

第1步:恢复到以前的迁移

要将数据库模式恢复到以前的点,使用:

 Update-Database –TargetMigration: <name of last good migration> 

指定最后的良好迁移。 如果您尚未应用迁移,则可以跳过此部分。

使用Get-Migrations命令获取已应用于数据库的迁移名称列表。

 PM> Get-Migrations Retrieving migrations that have been applied to the target database. 201508242303096_Bad_Migration 201508211842590_The_Migration_applied_before_it 201508211440252_And_another 

该列表首先显示最近应用的迁移。 select要降级的列表之后的列表中发生的迁移,即在要降级的列表之前应用的迁移。

 Update-Database –TargetMigration: "<the migration applied before it>" 

所有在指定的迁移后应用的迁移将按照最先应用的最新迁移的顺序进行降级。

第2步:从项目中删除您的迁移

现在,您可以从EF项目的“迁移”文件夹中删除错误的迁移。

对于那些使用EF Core和ASP.NET Core v1.0.0的人,我有类似的问题,并使用下面的命令来纠正它(@ DavidSopko的post指出我在正确的方向,但对于EF核心细节略有不同)

 Update-Database <Name of last good migration> Remove-Migration 

例如,在我目前的发展中,命令成了

 PM> Update-Database CreateInitialDatabase Done. PM> Remove-Migration Done. PM> 

删除迁移将删除您应用的上一次迁移。 如果你有一个更复杂的情况下需要移除多个迁移(我只有2个,最初和最坏的),我build议你testing一个虚拟项目中的步骤。

目前在EF Core(v1.0.0)中似乎没有Get-Migrations命令,因此您必须查看您的migrations文件夹并熟悉所做的事情。 但是,有一个很好的帮助命令:

 PM> get-help entityframework 

在VS2015 SQL Server对象资源pipe理器中刷新数据库,我的所有数据都被保留了,我想恢复的迁移已经结束了:)

最初我尝试了自己的Remove-Migration,发现错误命令令人困惑:

System.InvalidOperationException:迁移“…”已经应用于数据库。 不要应用它,然后再试一次。 如果迁移已应用于其他数据库,请考虑使用新的迁移恢复其更改。

已经有关于改善这个措辞的build议,但是我想要这样的错误:

运行更新数据库(上次正常迁移名称)将数据库架构恢复到该状态。 此命令将不会应用指定到Update-Database的迁移之后发生的所有迁移。 然后,您可以运行删除迁移(迁移名称以删除)

EF Core帮助命令的输出如下:

  PM> get-help entityframework _/\__ ---==/ \\ ___ ___ |. \|\ | __|| __| | ) \\\ | _| | _| \_/ | //|\\ |___||_| / \\\/\\ TOPIC about_EntityFrameworkCore SHORT DESCRIPTION Provides information about Entity Framework Core commands. LONG DESCRIPTION This topic describes the Entity Framework Core commands. See https://docs.efproject.net for information on Entity Framework Core. The following Entity Framework cmdlets are included. Cmdlet Description -------------------------- --------------------------------------------------- Add-Migration Adds a new migration. Remove-Migration Removes the last migration. Scaffold-DbContext Scaffolds a DbContext and entity type classes for a specified database. Script-Migration Generates a SQL script from migrations. Update-Database Updates the database to a specified migration. Use-DbContext Sets the default DbContext to use. SEE ALSO Add-Migration Remove-Migration Scaffold-DbContext Script-Migration Update-Database Use-DbContext