【问题标题】:EF Migrations: Rollback last applied migration?EF 迁移:回滚上次应用的迁移?
【发布时间】:2012-08-07 22:15:20
【问题描述】:

这看起来像是一项非常常见的任务,但我找不到简单的方法来完成它。

我想撤消上次应用的迁移。我本来期望一个简单的命令,比如

PM> Update-Database -TargetMigration:"-1"

相反,我能想到的只有:

PM> Get-Migrations

Retrieving migrations that have been applied to the target database.
201208012131302_Add-SystemCategory
201207311827468_CategoryIdIsLong
201207232247409_AutomaticMigration
201207211340509_AutomaticMigration
201207200025294_InitialCreate

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

(至少我可以只使用名称,跳过时间戳...)

有没有更简单的方法?

【问题讨论】:

  • 很遗憾,我们已经过了很多年,没有人真正阅读过这个问题。

标签: entity-framework entity-framework-4 database-migration entity-framework-migrations


【解决方案1】:

我想对这个帖子做一些澄清:

Update-Database -TargetMigration:"name_of_migration"

您在上面所做的是说您想要回滚所有迁移,直到您留下指定的迁移。因此,如果您使用 GET-MIGRATIONS 并发现您有 A、B、C、D 和 E,那么使用此命令将回滚 E 和 D 以将您带到 C:

Update-Database -TargetMigration:"C"

另外,除非有人能提出相反的意见,否则我注意到您可以使用序数值和短的 -Target 开关(因此,-Target 与 -TargetMigration 相同)。如果您想回滚所有迁移并重新开始,您可以使用:

Update-Database -Target:0

0,上面,甚至会回滚第一次迁移(这是一个破坏性的命令——在使用它之前确保你知道你在做什么!)——这是你不能做的事情您使用上面需要目标迁移名称的语法(在应用迁移之前,第 0 个迁移的名称不存在!)。因此,在这种情况下,您必须使用 0(序数)值。同样,如果您已应用迁移 A、B、C、D 和 E(按此顺序),则序数 1 应引用 A,序数 2 应引用 B,依此类推。所以要回滚到 B 你可以使用:

Update-Database -TargetMigration:"B"

Update-Database -TargetMigration:2

2019 年 10 月编辑:

根据这个相关的answer 类似的问题,正确的命令是 EF Core 1.1 的 -Target,而 EF Core 2.0 的正确命令是 -Migration

【讨论】:

  • 索引为0的迁移名称为$InitialDatabase
  • 谢谢。是否有任何 $(name) 值来引用其他索引位置,例如 $LatestDatabase 或类似的东西?
  • 我不知道。我无法通过简单的谷歌搜索找到任何内容。也许浏览 EF 源代码会发现它们?
  • 仅供参考,我们刚刚遇到了这个问题,并希望做与 OP 相同的事情......使用ls variable:* 看起来$InitialDatabase 只是一个定义为 0 的 PowerShell 变量,没有t 任何其他定义的,即使在当前的 EF 源代码中也是如此。而且,get-migrations 不会返回任何内容,它只会写入控制台,因此您无法遍历返回的对象...
  • 这应该是答案
【解决方案2】:

从 EF 5.0 开始,您描述的方法是首选方法。所以

PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"

或使用您的示例迁移

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

一种解决方案是创建一个包装 PS 脚本来自动执行上述步骤。此外,请随时为此创建功能请求,或者更好的是,尝试实现它! https://github.com/dotnet/ef6

【讨论】:

  • 另一个细节:如果您有一个现有的手动迁移需要回滚,但意识到您的“向下”方法并没有真正正确回滚,您可以编辑并保存它,然后重新运行 update-database -target... 直到它正确回滚。事后修改手动迁移 - 在您已经应用它之后 - 不会将其变成不允许编辑的内容。
  • 这对我不起作用。我得到的只是“指定的目标迁移“-1”不存在。
  • @tutiplain 看看他的第二个代码块。你引用他希望存在的东西,而不是确实存在的东西。
  • 使用 dotnet 命令执行此操作的正确方法是什么?抱歉,我在文档中找不到,或者我遗漏了一些东西。通过entityframeworktutorial.net/efcore/… 尝试过有什么建议吗?
  • -TargetMigration 不起作用,但 -Migration 起作用了,EF Core 5.0.7
【解决方案3】:

EntityFrameworkCore中:

Update-Database 20161012160749_AddedOrderToCourse

其中20161012160749_AddedOrderToCourse 是您要回滚到的迁移名称。

【讨论】:

  • 宝石!我花了一段时间才找到这个答案(因为他们已经为 .NET Core 更改了它)。绝对值得一票!
  • 您不需要包含日期/时间。您只需输入名称即可。
  • 这对我不起作用......它会说“完成”,但我指定的迁移之后的所有迁移仍然存在。并且没有执行任何这些迁移中的“Down”代码。
  • 也可以像这样运行回到特定的迁移:Update-Database -Migration: "AddedOrderToCourse" 特别是在迁移名称中使用空格时,这是这样做的方法。 (即 Update-Database -Migration "Added Order to Course")
【解决方案4】:

我意识到使用 CLI dotnet 命令没有任何好的解决方案,所以这里有一个:

dotnet ef migrations list
dotnet ef database update NameOfYourMigration

NameOfYourMigration 的位置输入您要恢复到的迁移的名称。

然后,您可以永久删除所有恢复的迁移

dotnet ef migrations remove

【讨论】:

    【解决方案5】:

    解决办法是:

    Update-Database –TargetMigration 201609261919239_yourLastMigrationSucess
    

    【讨论】:

    • 问题中已经说过了,提问者已经知道了。我不明白这有什么帮助,也许你可以更清楚一点?
    • 这个答案更简洁。 TY 麦克斯!
    【解决方案6】:

    EF CORE

    PM> Update-Database yourMigrationName

    (恢复迁移)

    PM> Update-Database

    为我工作

    在这种情况下,原始问题 (yourMigrationName = CategoryIdIsLong)

    【讨论】:

    • 之前的解决方案不适用于 EF Core ,参数错误,而这两个步骤的解决方案有效,在此之后我能够删除迁移,而在收到错误消息之前:迁移 '20210201060139_cascadeDelete ' 已应用于数据库。还原它并重试。尝试删除迁移时。尝试。
    【解决方案7】:
    update-database 0
    

    警告:这将回滚 EFCore 中的所有迁移!请小心使用:)

    【讨论】:

      【解决方案8】:

      补充提醒:

      如果你有多个配置类型,你需要指定[ConfigurationName]

      Update-Database -Configurationtypename [ConfigurationName] -TargetMigration [MigrationName]
      

      【讨论】:

        【解决方案9】:

        在 EF Core 中,添加错误迁移后,您可以在包管理器控制台中输入命令 Remove-Migration

        如果您的迁移可能涉及数据丢失,控制台建议您这样做:

        搭建了可能导致数据丢失的操作。 请检查迁移的准确性。要撤消此操作,请使用 移除-迁移。

        【讨论】:

        • 这仅适用于尚未在数据库上应用迁移的情况。
        【解决方案10】:

        我通过我的 (BASH GIT) 控制台 运行我的,同时运行 Entity Framework CoreUpdate-Database 命令在包控制台之外不起作用,我必须使用 donet ef 命令。

        donet ef database update [Name of previous Migration]
        

        这将运行您当前迁移的 protected override void Down(MigrationBuilder migrationBuilder) 方法和所有其他方法,以返回您设置的数据库版本。

        我也使用-p [migration project]-s [Project Solution]。这也允许它指向我的 appsettings.[Enviorment].json,其中存储了我访问数据库的密码。

        export ASPNETCORE_ENVIRONMENT=[ENVIORMENT]; donet ef database update [Name of previous Migration] -p [Migration Project Name] -s [Solution Name]
        

        其中很多可能是已知的,但如果您第一次这样做,希望提供详细信息。

        【讨论】:

          【解决方案11】:

          EF 核心

          将数据库更新到上一点

          update-database CategoryIdIsLong
          

          然后,删除错误的迁移

          remove-migration
          

          【讨论】:

            【解决方案12】:

            我正在使用 EntityFrameworkCore 并使用@MaciejLisCK 的答案。如果您有多个数据库上下文,您还需要通过添加上下文参数来指定上下文,例如:

            Update-Database 201207211340509_MyMigration -context myDBcontext

            (其中201207211340509_MyMigration 是您要回滚到的迁移,myDBcontext 是您的数据库上下文的名称)

            【讨论】:

              【解决方案13】:
              Update-Database –TargetMigration:"Your migration name"
              

              对于这个问题,我建议这个链接:

              https://elegantcode.com/2012/04/12/entity-framework-migrations-tips/

              【讨论】:

                【解决方案14】:

                我发现这在包管理器控制台中运行时有效:

                dotnet ef migrations list | select -Last 2 | select -First 1 | ForEach-Object { Update-Database -Migration $_ }

                您可以创建一个更容易的脚本。

                【讨论】:

                  【解决方案15】:

                  如果有数据丢失的可能性,EF 不会完成 update-database 命令,因为默认情况下 AutomaticMigrationDataLossAllowed = false,并且会回滚操作,除非您使用 -force 参数运行它。 p>

                  Update-Database –TargetMigration:"Your migration name" -force
                  

                  Update-Database –TargetMigration:Your_Migration_Index -force
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-03-01
                    • 1970-01-01
                    • 2018-08-01
                    • 2014-06-21
                    • 1970-01-01
                    • 2012-08-27
                    相关资源
                    最近更新 更多