0

我在 VS 2010 中使用 EF 6.0.1,并且在将主干中的迁移应用到生产数据库后,我正在将多个迁移从分支合并到主干,并且我无法在没有错误的情况下重新构建以前的迁移。在我的情况下,大约有 50 个迁移被合并 - 下面的示例只有两个来说明问题。

请注意,我可以在主干中重新创建迁移,但我宁愿不要,因为我们有大约 50 个迁移,并且许多迁移经过大量编辑,并且还有大量原始 SQL 进行数据操作。重新创建这将是一项艰巨的工作,更不用说它只会导致一次大规模迁移。

这是一个简化的场景:

  1. 我有一个域实体类 Widget:

    public class Widget
    {
        public int Id { get; set; }
    }
    
  2. 主干分支到 BigProjectBranch

  3. 在 BigProjectBranch 中,我将 Name 属性添加到 Widget 并创建 Migration1:

    public class Widget
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    
    public partial class Migration1 : DbMigration
    {
        public override void Up()
        {
            AddColumn("dbo.Widgets", "Name", c => c.String());
        }
        //...
    }
    
  4. 仍在 BigProjectBranch 中,我将 Category 属性添加到 Widget 并创建 Migration2:

    public class Widget
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Category { get; set; }
    }
    
    public partial class Migration2 : DbMigration
    {
        public override void Up()
        {
            AddColumn("dbo.Widgets", "Category", c => c.String());
        }
        //...
    }
    
  5. 稍后,在 Trunk 中,我将 Status 属性添加到 Widget 并创建 Migration3。此迁移应用于生产数据库(因此无法在另一个分支中删除和重新创建)。

    public class Widget
    {
        public int Id { get; set; }
        public string Status { get; set; }
    }
    
    public partial class Migration3 : DbMigration
    {
        public override void Up()
        {
            AddColumn("dbo.Widgets", "Status", c => c.String());
        }
        //...
    }
    
  6. BigProjectBranch 被合并回 Trunk。我们现在将 Migration3 应用于数据库,以及 Migration1 和 Migration2,它们按时间顺序较早但未应用于数据库。

    public class Widget
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Category { get; set; }
        public string Status { get; set; }
    }
    
  7. 按照http://coding.abel.nu/2012/02/ef-migrations-and-a-merge-conflict/中的建议和几个 SO 答案,我尝试重新搭建 Migration1 并得到一个错误:

    PM> Add-Migration Migration1
    Unable to generate an explicit migration because the following explicit migrations are pending: [201311032026211_Migration1, 201311032027440_Migration2]. Apply the pending explicit migrations before attempting to generate a new explicit migration.
    
  8. 我为 Migration2 尝试了同样的方法,它成功了:

    PM> Add-Migration Migration2
    Re-scaffolding migration 'Migration2'.
    Only the Designer Code for migration 'Migration2' was re-scaffolded. To re-scaffold the entire migration, use the -Force parameter.
    

    迁移让我现在可以将 Migration2 应用到数据库,但这会导致以错误的顺序应用迁移(即 Migration2 在 Migration1 之前)。

  9. 不幸的是,再次尝试 Migration1 会导致与步骤 7 相同的错误。

请问有解决这个问题的想法吗?

4

1 回答 1

0

好像您的迁移历史记录表不同步。请参阅此Entity Framework Code Migrations - Stuck on Initial Migration和 Julie Lermans 链接,以便更好地了解如何重新开始,因为更改已从分支合并到主干。

我还建议,因为有一个模式和两个项目考虑一个从源合并到包含两组更改的分支的公共项目,在这种情况下合并,重新合并将导致问题,正如您当前的问题所表明的那样。

于 2013-11-04T04:10:40.230 回答