【问题标题】:Make EF4.3 Code First Migrations ignore pending migrations使 EF4.3 Code First 迁移忽略挂起的迁移
【发布时间】:2012-03-29 12:03:38
【问题描述】:

我有一个我最近使用DbContext.Database.Create() 创建的数据库的本地实例,因此__MigrationHistory 表存在与当前匹配代码的InitalCreate 条目。

但是,Migrations 文件夹中存在一些基于代码的迁移。这些将在我们的开发和登台环境中运行,以使这些数据库与代码保持一致。但是,我不需要在本地应用它们,因为我使用当前代码创建了数据库。

我现在需要对模型进行更改并创建相应的迁移。但是当我运行Add-Migration TestMigration 时,出现以下错误

Unable to generate an explicit migration because the following explicit 
migrations are pending: 

[201203271113060_AddTableX, 
 201203290856574_AlterColumnY]

Apply the pending explicit migrations before attempting to generate 
a new explicit migration.

在这种情况下我该怎么办?我不能将 Add-Migration 工具指向另一个环境,因为不能保证该版本与我在本地拥有的版本相匹配。我想要一个只匹配我所做更改的迁移。

我似乎有几个选择,但没有一个是理想的:

  1. 从 Migrations 文件夹中删除其他迁移,运行 Add-Migration 命令,升级数据库,然后恢复旧迁移。这很简单,但似乎有点 hackish。
  2. 恢复到应用第一次迁移的源代码控制中的模型版本,然后构建它并使用它来创建数据库。然后获取最新版本,应用所有迁移,然后我就可以添加我的迁移了。这似乎需要付出很多努力!
  3. 手动创建迁移。

有人对如何管理有任何建议吗?

【问题讨论】:

    标签: entity-framework-4.3 entity-framework-migrations


    【解决方案1】:

    我们计划使用您的选项 #1 的变体...

    我们的标准操作程序是为每次迁移生成一个 SQL 脚本(使用 update-database 的 -script 选项),以便通过 InstallShield 将 SQL 脚本应用于最终用户“生产”数据库(我们计划仅将 EF update-database 用于开发人员数据库)。

    因此,我们的 Migrations 文件夹中同时拥有 Migration .cs 文件和所有迁移的相应 .sql 文件。

    因此,我们不是从 Migrations 文件夹中删除迁移(如您在 #1 中建议的那样),而是使用 SQL Mgmt Studio 手动仅应用 .sql 文件中执行插入到 _MigrationHistory 的部分。

    这会使本地数据库的 _MigrationHistory 与已合并到该数据库中的更改保持同步。

    但这是一个杂项,我们仍在寻找更好的解决方案。

    爸爸猫

    【讨论】:

      【解决方案2】:

      我发现效果最好的方法非常简单:启用迁移后不要使用DbContext.Database.Create()。如果您想以编程方式创建新数据库,请改用迁移 API。

      var migrator = new DbMigrator(new Configuration());
      migrator.Update();
      

      然后您就获得了完整的迁移历史记录,并且添加更多迁移的工作与预期一样。

      【讨论】:

        【解决方案3】:

        您需要从包管理器控制台运行“update-database”以将更改推送到数据库,或者您可以从 Migrations 文件夹中删除待处理的迁移文件 ([201203271113060_AddTableX]),然后重新运行“add-迁移”以根据您的编辑创建一个全新的迁移。

        【讨论】:

          【解决方案4】:

          我也遇到了同样的问题。 如果你运行

          Update-database
          

          然后运行

          Add-Migration YourMigrationName
          

          这样就解决了问题

          【讨论】:

          • 这不起作用,因为早期的迁移操作无法在使用 DbContext.Database.Create() 创建的数据库上运行。想象一下添加一列的迁移,但在您的新本地数据库中,您已经拥有该列,因此您得到一个SqlException,并且相关行永远不会添加到__MigrationHistory 表中。请参阅我的答案,了解我认为正确的方法。
          【解决方案5】:

          只需从解决方案文件中排除旧的迁移文件。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-12-13
            • 2016-08-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-10
            • 1970-01-01
            • 2015-01-24
            相关资源
            最近更新 更多