【问题标题】:Reset Entity-Framework Migrations重置实体框架迁移
【发布时间】:2012-07-25 15:14:31
【问题描述】:

我搞砸了我的迁移,我在初始迁移中使用了IgnoreChanges,但现在我想删除我的所有迁移并从包含所有逻辑的初始迁移开始。

当我删除文件夹中的迁移并尝试 Add-Migration 时,它不会生成完整文件(它是空的 - 因为自上次迁移以来我没有进行任何更改,但现在已删除)。

是否有任何 Disable-Migrations 命令,以便我可以重新运行Enable-Migrations

【问题讨论】:

  • 如果您有多个连接字符串,请注意一个重要提示:在重置迁移时指定使用哪一个,否则它将尝试同时应用于两者,这可能会在出现差异时导致问题。
  • 注意:如果你没有删除你的迁移(你确实使用版本控制对吗?),你可以更新你的 db - 到你第一次迁移,然后删除缓解并从那时开始创建新的迁移.见这里:stackoverflow.com/a/23793384/309634

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


【解决方案1】:

你需要:

  1. 删除状态:删除项目中的迁移文件夹;并且
  2. 删除数据库中的__MigrationHistory表(可能在系统表下);那么
  3. 在包管理器控制台中运行以下命令:

    Enable-Migrations -EnableAutomaticMigrations -Force
    

    使用或不使用-EnableAutomaticMigrations

  4. 最后,您可以运行:

    Add-Migration Initial
    

【讨论】:

  • ^^ 弄清楚了——这是一个 TFS 错误——如果您使用的是 TFS,则需要在运行“Enable-Migrations ...”命令之前执行签入。 :D
  • 如果您没有使用版本控制,请在删除之前保存您的种子值!
  • @RyanJMcGowan 如果你没有使用版本控制,你应该失去你的工作。 :-)
  • @Tood。对此+1。为我节省了很多时间。现在,如果只有 EF 团队可以将所有这些合并到 Reset-Migrations 命令中。也许 EF 6...
  • 对于已有的数据库,需要注释掉“Up”函数的内容。否则运行“Update-Database”会报错,提示表已经存在
【解决方案2】:

我的问题原来是我手动删除了 Migrations 文件夹。我这样做是因为我想备份内容,所以我只是将文件夹拖出项目。后来我通过将其放回(制作备份副本后)解决了该问题,然后通过在解决方案资源管理器中右键单击它并从弹出菜单中选择删除来删除迁移文件夹。

【讨论】:

    【解决方案3】:

    问题:您搞砸了迁移,并且希望在不删除现有表的情况下重置它。

    问题:您无法使用数据库中的现有表重置迁移,因为 EF 想要从头开始创建表。

    做什么:

    1. 从 Migrations_History 表中删除现有迁移。

    2. 从迁移文件夹中删除现有迁移。

    3. 运行添加迁移重置。这将在您的 Migration 文件夹中创建一个迁移,其中包括创建表(但它不会运行它,因此不会出错。)

    4. 您现在需要在 MigrationHistory 表中创建初始行,以便 EF 拥有当前状态的快照。如果您应用迁移,EF 将执行此操作。但是,您不能应用刚刚进行的迁移,因为数据库中已经存在表。所以进入 Migration 并注释掉“Up”方法中的所有代码。

    5. 现在运行更新数据库。它将应用迁移(而不是实际更改数据库)并在 MigrationHistory 中创建快照行。

    您现在已重置迁移,可以继续正常迁移。

    【讨论】:

    • 这是唯一对我有用的答案。接受的答案似乎没有解决运行 Update-Database 或运行应用程序时会发生什么的问题(取决于您使用的初始化程序类型)。它将尝试运行迁移并尝试进行已存在的更改。除非我错过了什么。
    • 这也是更灵活的答案。在我的情况下,我需要应用一些更改,而其他一些则不需要。我可以将有用的东西保留在我的 Up() 中。
    • @H.Johnson,我看过了。您对此有任何疑问吗?
    • 有一点需要注意,从 EF 6.0 开始,_MigrationsHistory 表包含多个 DBContext 的迁移。删除它可能会导致问题,您应该只删除 ContextKey = 您的迁移名称的行。同样在上述 2 之后,我不得不再次启用迁移
    • 基本相同的答案,带有扩展示例(带屏幕截图):weblog.west-wind.com/posts/2016/Jan/13/…
    【解决方案4】:

    怎么样

    Update-Database –TargetMigration: $InitialDatabase
    

    在包管理器控制台中?它应该将所有更新重置为其早期状态。

    参考链接:Code First Migrations - Migrating to a Specific Version (Including Downgrade)

    【讨论】:

    • 我认为我的主要挫折是不再相信迁移能够准确地维护状态。因此想要从头开始。
    • @Todd,我偶然发现并不清楚是否应该删除迁移文件以重新开始。现在它正在执行以下操作: 1. 使用命令“Update-Database –TargetMigration: $InitialDatabase”恢复到初始状态。 2. 删除所有迁移文件(使用 yyyyMMddHHmmssx_Name.cs 或 .vb 命名) 3. 使用“add-Migration -Name some_name”刷新更新。 4. 使用“update-Database”发布更新以影响您的数据库。希望它对你有用。
    • 就我而言,此答案中建议的命令导致 SQL 错误。
    • “InitialDatabase”应该是什么意思?它会删除数据库中已经创建的表或列吗?
    【解决方案5】:

    在 EntityFramework 6 中请尝试:

    Add-Migration Initial
    

    为了更新初始迁移文件。

    【讨论】:

      【解决方案6】:

      在 EF6 中

      1. 删除“迁移”文件夹中的所有文件...但不要删除“初始创建”或“配置”。
      2. 删除数据库。
      3. 现在运行Add-Migration Initial
      4. 现在您可以“更新数据库”,一切都会好起来的。

      【讨论】:

        【解决方案7】:
        Enable-Migrations -EnableAutomaticMigrations -Force
        

        【讨论】:

          【解决方案8】:

          要解决此问题,您需要:

          1. 删除迁移文件夹中的所有 *.cs 文件。

          2. 删除数据库中的_MigrationHistory表

          3. 运行Enable-Migrations -EnableAutomaticMigrations -Force

          4. 运行Add-Migration Reset

          然后,在public partial class Reset : DbMigration 类中,您需要注释所有现有的和当前的表:

          public override void Up()
          {
          // CreateTable(
          // "dbo.<EXISTING TABLE NAME IN DATABASE>
          // ...
          // }
          ...
          }
          

          如果你错过了这一点,一切都会失败,你必须重新开始!

          1. 现在运行Update-Database -verbose

          如果以上操作正确,应该就成功了,现在可以正常进行了。

          【讨论】:

          • 不用注释掉所有内容,你也可以只写“return;”在方法 Up() 的第一行。
          【解决方案9】:

          在 Entity Framework Core 中。

          1. 从迁移文件夹中删除所有文件。

          2. 在控制台输入

            dotnet ef database drop -f -v
            dotnet ef migrations add Initial
            dotnet ef database update
            
          3. (或用于包管理器控制台)

            Drop-Database -Force -Verbose
            Add-Migration Initial
            Update-Database
            

          UPD:仅当您不关心当前的持久数据时才这样做。如果你这样做,use Greg Gum's answer

          【讨论】:

          • 如果您想保留现有数据(如果您只想“重置迁移”),请不要这样做
          • 小心这个。该问题要求重置迁移,而不是清除数据库数据。
          【解决方案10】:

          考虑到当我们在 .NET Core 中搜索 EF 时仍然会出现这种情况,我将在此处发布我的答案(因为它一直困扰着我)。请注意,EF 6 .NET 版本有一些细微之处(没有初始命令,您需要删除“快照”文件)

          (在 .NET Core 2.1 中测试)

          步骤如下:

          1. 删除_efmigrationhistory 表。
          2. 在整个解决方案中搜索名称中包含 Snapshot 的文件,例如 ApplicationDbContextSnapshot.cs,然后删除它们。
          3. 重建您的解决方案
          4. 运行Add-Migration InitialMigration

          请注意: 您必须删除所有快照文件。我花了无数个小时只是删除数据库...如果您不这样做,这将生成一个空迁移。

          此外,在 #3 中,您可以随意命名迁移。

          这里有一些额外的资源: asp.net CORE Migrations generated empty

          Reset Entity Framework 7 migrations

          【讨论】:

            【解决方案11】:

            此方法不需要删除__MigrationHistory 表,因此您不必在部署时将手放在数据库上。

            1. 从 Migrations 文件夹中删除现有迁移。
            2. 在包管理器控制台中运行Add-Migration ResetMigrations
            3. Up() 方法中清除迁移历史记录:
            /// <summary>
            /// Reset existing migrations by cleaning the __MigrationHistory table
            /// and creating a new initial migration with the current model snapshot.
            /// </summary>
            public partial class ResetMigrations : DbMigration
            {
                public override void Up()
                {
                    Sql("DELETE FROM [dbo].[__MigrationHistory]");
                }
            
                public override void Down()
                {
                }
            }
            

            【讨论】:

              【解决方案12】:

              在 Net Core 3.0 中:

              我无法找到重置迁移的方法。

              我也遇到了迁移失败的问题,这里提供的答案对我不起作用。我有一个 .Net Core 3.0 Web API,在上个月的某个地方,我直接编辑了数据库。是的,我做了一件坏事。

              此处建议的策略导致包管理器控制台出现许多错误:

              • 该名称的迁移已存在
              • 找不到快照
              • 'Force' 不是可识别的参数

              当然,我可能错过了一个步骤或错过了清除正确文件的步骤,但我发现有一些方法可以在没有太多暴力的情况下清除它:

              • 从 PMC 中为每个迁移按名称删除迁移,以与创建相反的顺序,直到并包括损坏的迁移
              • Add-Migration 创建一个新的迁移,这将是最后一次良好迁移到当前架构之间的增量

              现在,当 Web API 以空数据库启动时,它会正确创建所有表和属性以匹配实体模型。

              HTH!

              【讨论】:

                【解决方案13】:

                删除 Migrations 文件夹,Clean 然后Rebuild 项目。这对我有用。在 Clean and Rebuild 之前,它表示迁移已经存在,因为在其缓存内存中,它还没有被删除。

                【讨论】:

                • 为我工作!请注意,删除迁移文件夹后,您必须再次运行 enable-migrations。
                【解决方案14】:

                2020 年更新 => 重置实体框架迁移

                Add-Migration Initial -Context ApplicationDbContext
                

                ApplicationDbContext => 你的上下文。

                但如果您只需要更新现有的身份架构,请尝试: https://stackoverflow.com/a/59966100/4654957

                【讨论】:

                • 没有关于这试图解决什么的上下文。
                【解决方案15】:

                VSC(Visual Studio Code) -- .Net Core

                1.删除状态:删除项目中的migrations文件夹;

                2.删除数据库中__MigrationHistory的记录;

                3.dotnet ef database drop -v 然后 您确定要删除服务器 '.' 上的数据库 '

                4.dotnet ef migrations add Initial 然后将20211014110429_initial类的代码写入__MigrationHistory的

                【讨论】:

                  猜你喜欢
                  • 2015-05-11
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-08-09
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-06-24
                  相关资源
                  最近更新 更多