我在 VS 2010 中使用 EF 6.0.1,并且在将主干中的迁移应用到生产数据库后,我正在将多个迁移从分支合并到主干,并且我无法在没有错误的情况下重新构建以前的迁移。在我的情况下,大约有 50 个迁移被合并 - 下面的示例只有两个来说明问题。
请注意,我可以在主干中重新创建迁移,但我宁愿不要,因为我们有大约 50 个迁移,并且许多迁移经过大量编辑,并且还有大量原始 SQL 进行数据操作。重新创建这将是一项艰巨的工作,更不用说它只会导致一次大规模迁移。
这是一个简化的场景:
我有一个域实体类 Widget:
public class Widget { public int Id { get; set; } }
主干分支到 BigProjectBranch
在 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()); } //... }
仍在 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()); } //... }
稍后,在 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()); } //... }
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; } }
按照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.
我为 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 之前)。
不幸的是,再次尝试 Migration1 会导致与步骤 7 相同的错误。
请问有解决这个问题的想法吗?