VS 2010 で EF 6.0.1 を使用していますが、トランク内の移行が運用データベースに適用された後、複数の移行をブランチからトランクにマージしているという問題があり、以前の移行をエラーなしで再スキャフォールディングできません。私の状況では、約 50 の移行がマージされています。以下の例では、問題を説明するために 2 つしかありません。
トランクで移行を再作成することもできますが、約 50 の移行があり、その多くは大幅に編集されており、データ操作を行う未加工の SQL もたくさんあるため、むしろやりたくないことに注意してください。これを再現するのは大変な作業であり、1 回の大規模な移行が必要になることは言うまでもありません。
簡単なシナリオを次に示します。
ドメイン エンティティ クラス ウィジェットがあります。
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 で Widget に Status プロパティを追加し、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.
Migrations を使用すると、Migration2 をデータベースに適用できるようになりましたが、これにより、Migration が間違った順序で適用されることになります (Migration2 が Migration1 の前に適用されるなど)。
残念ながら、Migration1 を再試行すると、ステップ 7 と同じエラーが発生します。
これを解決するためのアイデアはありますか?