【问题标题】:stuck in EF migration limbo陷入EF迁移困境
【发布时间】:2013-06-01 21:21:54
【问题描述】:

不知何故,我的 EF5 项目进入了无法继续的状态。

当我执行“更新数据库”时,我得到:

无法更新数据库以匹配当前模型,因为存在待处理的更改并且自动迁移已禁用。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 以启用自动迁移。 您可以使用 Add-Migration 命令将挂起的模型更改写入基于代码的迁移。

好的,很好,所以我尝试“添加迁移”,我得到:

无法生成显式迁移,因为以下显式迁移处于挂起状态:[ ]。在尝试生成新的显式迁移之前应用挂起的显式迁移。

20 转到 10 ??

此时我应该怎么做? (除了切换到 NHibernate 之外?)

【问题讨论】:

  • 如果您有任何迁移,甚至是最初的迁移,请尝试注释掉代码并运行项目。有时这会超出此错误。
  • @Davy8 你能做“Update-Database -Force”吗?
  • @Kittoes 我试过了,但没有骰子。仍然有同样的错误。我还在添加迁移上尝试了-Force,但没有运气。我让它工作的唯一方法是我发布的答案很混乱但有效。很想听听不那么丑陋的解决方案。
  • 理论上代码优先是好的,在现实生活中,数据库优先是更好的方法。您可以完全控制数据库,如果出于任何原因,代码中的错误首先导致生产服务器中的数据丢失,您将对此负责。代码首先的问题是,您无法预览更改,也无法阻止有害更改。
  • 不幸的是,这个问题没有得到解决,而且可能永远也不会得到解决。 EF是一个很棒的产品。这只会杀死它。

标签: entity-framework entity-framework-migrations


【解决方案1】:

对我有用的是:

  1. 将我的所有更改(首先进行备份)恢复到已知的良好状态。
  2. 正在做add-migration DummyMigration。这产生了一些我评论过的虚假变化
  3. 调用 update-database 将迁移 + 元数据添加到 [__MigrationHistory] 表中。
  4. 进行我需要的更改(从我之前获取的代码的备份中)。
  5. 做正常的add-migration/update-database

不理想,如果有更好的解决方案会很酷,但这对我有用。

【讨论】:

  • 之所以可行是因为DummyMigration 包含报告数据库状态的隐藏元数据。如果需要,您实际上可以清空在 Up/Down 方法中生成的任何内容,以防止它们重新运行。例如就我而言,它想重新创建我所有的表,这绝对不行。在第二次迁移中,您可以在第一次迁移按顺序获得数据库状态后执行所需的任何更新。
  • 如果您将-ignorechanges 添加到第一行add-migration,它将生成一个仅包含模型快照的空迁移,因此您不必注释掉更改。
【解决方案2】:

对我而言,问题在于我们已将迁移的命名空间重命名为 2014123456_Initial.cs。
但是 VS 并没有在其关联的 2014123456_Initial.Designer.cs 中重新生成命名空间。

一旦将 Designer.cs 更改为使用相同的命名空间,它就会重新开始工作。


(也将此作为答案发布here,因为这两个问题非常相似)

【讨论】:

    【解决方案3】:

    我将Configuration.cs 类中的以下值从false 更改为true

    AutomaticMigrationsEnabled = true; 
    

    App_Data 文件夹中,我重命名了项目的数据库 - 以 .mdf 结尾的文件(因此将创建一个新的),并在 Package Manager Console 我输入了以下命令:

    更新数据库

    之后,待定迁移顺利进行。

    请注意,这对我有用,但如果这是最佳做法,我不是 100%。无论如何,这个Entity Framework Code First 迁移指南说:

    “如果你得到一个错误,表明一个表已经存在并且不能被创建,这可能是因为你在删除数据库之后执行更新数据库之前运行了应用程序。在这种情况下,再次删除 Movies.mdf 文件并重试 update-database 命令。如果仍然出现错误,请删除迁移文件夹.."

    还有关于AutomaticMigrationsEnabled = true; 这个MSDN article, Data Points : A Code First Migrations Mystery: Solved 告诉“迁移可以自动运行,这意味着将发现模型更改并在数据库上创建和执行与更改对应的迁移。所有这些都发生在运行时在数据库初始化期间。自动迁移对于简单的应用程序来说很方便,但是您对它们的控制很少,我通常不建议启用它们。当 Code First 将默认设置切换为 false 时,我很高兴。”

    【讨论】:

      【解决方案4】:

      我在创建数据库时犯了错误

          using System.ComponentModel.DataAnnotations;
          using System.Globalization;
          namespace ProductsManager.Models
          {
              public class Product
              {
                  public int ProductId { get; set; }
                  public string Name { get; set; }
                  public string Description { get; set; }
                  public string Production { get; set; }
                  public string Size { get; set; }
                  public decimal<--- Price { get; set; }
                  public string Barcode { get; set; }
              }
          }
      

      在添加迁移初始后,我意识到并将代码更改为 public int Price { get;放; } 做了相同的 add-migration DummyMigration 并在迁移文件夹中创建 080372472_dummyMigration

      namespace IdetityBeta.Migrations
      {
          using System;
          using System.Data.Entity.Migrations;
      
          public partial class DummyMigration : DbMigration
          {
              public override void Up()
              {
                  AlterColumn("dbo.Products", "Price", c => c.String());
              }
      
              public override void Down()
              {
                  AlterColumn("dbo.Products", "Price", c => c.Decimal(nullable:             false, precision:              18, scale: 2));
              }
          }
      }
      

      那么更新数据库和问题就解决了

      【讨论】:

        【解决方案5】:

        我解决了这个问题

        • 运行“更新-数据库-脚本-强制”
          • 请注意在“无法更新数据库...”错误之前尝试的最后一次显式迁移
        • 使用上次尝试记录的最后一次迁移运行“Update-Database -Script -TargetMigration [lastmigration]”

        然后我可以在脚本中运行并添加新的迁移。这是在 EF6 和 Nuget 2.8 上 - 发布问题时它可能不起作用。

        【讨论】:

          【解决方案6】:
          1. Update-Database –TargetMigration &lt;second_last_migration&gt;
          2. Add-Migration &lt;full_name_including_timestamp_of_last_migration&gt;

            您需要包含时间戳,以便迁移知道您想要编辑现有迁移而不是构建新迁移。这将更新上次迁移的元数据以匹配当前模型。

          3. Update-Database

          来源https://docs.microsoft.com/en-gb/ef/ef6/modeling/code-first/migrations/teams#resolving-the-merge-conflict

          【讨论】:

            【解决方案7】:

            当您尝试与与您的迁移具有相同基础的迁移合并时,可能会发生这种情况,因为即使该表存在,其中一个迁移架构也存在模型差异

            要解决这个问题,你可以通过命令创建合并迁移

            添加迁移-IgnoreChanges

            后跟迁移名称

            这会创建一个以当前模型作为快照的空迁移。因此,这将解决您的模型差异问题,并且您的表和模型将同步

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多