.net 将多个EF代码首次迁移从分支合并到主干时出错

.net 将多个EF代码首次迁移从分支合并到主干时出错,.net,entity-framework,ef-code-first,entity-framework-migrations,.net,Entity Framework,Ef Code First,Entity Framework Migrations,我在VS 2010中使用EF 6.0.1,遇到一个问题,即在主干中的迁移应用于生产数据库之后,我正在将多个从分支到主干的迁移合并到主干中,并且我无法在没有错误的情况下重新构建以前的迁移。在我的情况下,大约有50个迁移正在被合并——下面的例子只有两个来说明这个问题 请注意,我可以在trunk中重新创建迁移,但我不希望这样,因为我们有大约50个迁移,其中许多迁移都经过了大量编辑,而且还有大量原始SQL执行数据操作。这将是一项需要重新创建的巨大工作,更不用说它只会导致一次大规模迁移 下面是一个简化的场

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

请注意,我可以在trunk中重新创建迁移,但我不希望这样,因为我们有大约50个迁移,其中许多迁移都经过了大量编辑,而且还有大量原始SQL执行数据操作。这将是一项需要重新创建的巨大工作,更不用说它只会导致一次大规模迁移

下面是一个简化的场景:

  • 我有一个域实体类小部件:

    public class Widget
    {
        public int Id { get; set; }
    }
    
  • 主干分支为大分支

  • 在BigProjectBranch中,我向小部件添加了一个Name属性,并创建了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());
        }
        //...
    }
    
  • 仍然在BigProjectBranch中,我向小部件添加了一个Category属性并创建了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());
        }
        //...
    }
    
  • 稍后,在Trunk中,我向小部件添加一个Status属性并创建Migration3。此迁移应用于生产数据库(因此无法在其他分支中删除和重新创建)

  • BigProjectBranch被合并回主干。我们现在将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; }
    }
    
  • 按照中的建议和几个SO答案,我尝试重新构建迁移1,但出现了一个错误:

    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.
    
  • 我在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.
    
    Migrations允许我现在将Migration2应用于数据库,但这会导致以错误的顺序应用迁移(即Migration1之前的Migration2)

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


  • 有什么解决方法吗?

    您的迁移历史记录表似乎不同步。查看此链接和Julie Lermans链接,更好地了解如何重新开始,因为更改已从分支合并到主干


    我也建议,因为有一个模式,两个项目考虑一个从源到分支的合并项目,它包含了两组变化,合并,重新出现在这种情况下会导致问题,如您当前的问题所示。

    谢谢@ Mike Beeler。是的,我的迁移表不同步-但如上所述,我无法在没有错误的情况下使其恢复同步。我当然不想在每次将迁移从分支合并到主干时都重新开始代码迁移!这是一个系统和一个代码库-分支用于分离长时间运行的项目上的构建-然后合并回主干。我确实有一个“公共项目”——数据访问层——但它在导致上述问题的分支或主干中进行了修改。必须有一个妥善的办法来解决这一混乱局面。
    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.