0

VS 2010 で EF 6.0.1 を使用していますが、トランク内の移行が運用データベースに適用された後、複数の移行をブランチからトランクにマージしているという問題があり、以前の移行をエラーなしで再スキャフォールディングできません。私の状況では、約 50 の移行がマージされています。以下の例では、問題を説明するために 2 つしかありません。

トランクで移行を再作成することもできますが、約 50 の移行があり、その多くは大幅に編集されており、データ操作を行う未加工の SQL もたくさんあるため、むしろやりたくないことに注意してください。これを再現するのは大変な作業であり、1 回の大規模な移行が必要になることは言うまでもありません。

簡単なシナリオを次に示します。

  1. ドメイン エンティティ クラス ウィジェットがあります。

    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 で 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());
        }
        //...
    }
    
  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.
    

    Migrations を使用すると、Migration2 をデータベースに適用できるようになりましたが、これにより、Migration が間違った順序で適用されることになります (Migration2 が Migration1 の前に適用されるなど)。

  9. 残念ながら、Migration1 を再試行すると、ステップ 7 と同じエラーが発生します。

これを解決するためのアイデアはありますか?

4

1 に答える 1

0

移行履歴テーブルが同期していないようです。このEntity Framework Code Migrations - Stuck on Initial Migrationと Julie Lermans のリンクを参照して、変更がブランチからトランクにマージされた今、最初からやり直す方法をよりよく理解してください。

また、1 つのスキーマと 2 つのプロジェクトがソースからブランチにマージされ、両方の変更セットを含む共通のプロジェクトと見なされるため、この場合のマージ、再マージは、現在の質問が示すように問題を引き起こすことをお勧めします。

于 2013-11-04T04:10:40.230 に答える