我使用EF 6.0为我的项目在c#手动迁移和更新。我在数据库上进行了大约5次迁移,但我意识到最后一次迁移很糟糕,我不想要它。我知道我可以回滚到以前的迁移,但是当我添加一个新的(固定的)迁移并运行Update-Database时,甚至应用了糟糕的迁移。

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

是否有一些查询,我可以运行,这将告诉EF类似“忘记上次迁移,就像它从来没有存在过,它是坏的”?类似于Remove-Migration。

Edit1 我找到了适合我的解决办法。将模型更改为良好状态并运行Add-Migration TheBadMigration -Force。这将重新构建最后一个未应用的迁移。

无论如何,这仍然没有完全回答最初的问题。如果我UpdateDatabase到坏的迁移,我没有找到好方法如何回滚和创建新的迁移,排除坏的一个。

谢谢


当前回答

确保你的项目文件中没有错误,即使在你的迁移文件中,我在我的上一个迁移文件中有一个错误,不允许我删除它。

其他回答

首先,通过这个命令更新你最后的完美迁移:

Update-Database –TargetMigration

例子:

Update-Database -20180906131107_xxxx_xxxx

然后手动删除未使用的迁移。

对于EF 6,如果你在开发中重新搭建了很多,这里有一个单行程序。只需更新vars,然后继续使用包管理器控制台中的向上箭头来冲洗和重复。

$lastGoodTarget = "OldTargetName"; $newTarget = "NewTargetName"; Update-Database -TargetMigration "$lastGoodTarget" -Verbose; Add-Migration "$newTarget" -Verbose -Force

你问为什么有这个必要?不确定这适用于EF6的哪个版本,但如果你的新迁移目标已经被应用,那么使用'-Force'在Add-Migration中重新脚手架,实际上不会重新脚手架,而是创建一个新文件(这是一件好事,因为你不想失去你的'Down')。如果有必要,上面的代码片段首先进行“向下”,然后-Force正常工作以重新脚手架。

确保你的项目文件中没有错误,即使在你的迁移文件中,我在我的上一个迁移文件中有一个错误,不允许我删除它。

对于那些使用EF Core与ASP。NET Core v1.0.0我有一个类似的问题,并使用以下命令来纠正它(@DavidSopko的帖子为我指明了正确的方向,但EF Core的细节略有不同):

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

例如,在我当前的开发中,命令变成

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

remove - migration将删除您应用的最后一次迁移。如果您有一个更复杂的场景,需要删除多个迁移(我只有2个,初始的和坏的),我建议您在一个虚拟项目中测试这些步骤。

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

PM> get-help entityframework

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

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

系统。InvalidOperationException:迁移'…’已经被 应用于数据库。取消应用,再试一次。如果迁移 已经应用到其他数据库,是否考虑恢复其更改 使用新的迁移。

已经有人提出了改进这一措辞的建议,但我希望错误是这样的:

运行Update-Database(最后一个良好的迁移名称)将数据库模式恢复到该状态。这个命令将 取消应用指定的迁移之后发生的所有迁移 - database就。然后您可以运行remove - migration(要删除的迁移名称)

EF Core help命令输出如下:

 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

你也可以使用

Remove-Migration -Force

这将恢复并删除最后应用的迁移