32

Entity Framework 5.0 Code First Migrations を使用していますが、Update-Database の実行に問題があります。保留中のモデル変更があると表示されます。しかし、それは最新のはずなので、実行します

Add-Migration SomeMigrationName

ファイルを作成します...ただし、以前の移行の複製と本質的に同じファイルを作成します(そのファイルでUpdate-Databaseを再度試行すると、非-存在する制約)。さらに、DB 内のデータ モデルと __MigrationHistory テーブル内のレコードの存在の両方に基づいて、「元の」移行が実行されたことを確認できました。

データベース全体を削除し、自動または手動ですべての移行を再度実行すると、同じ問題が発生します。

私が持っていた「元の」移行ファイルは次のとおりです。

public partial class RenameLinkColumns : DbMigration
{
    public override void Up()
    {
        DropForeignKey("dbo.Listing", "OfferedByUserId", "dbo.User");
        DropIndex("dbo.Listing", new[] { "OfferedByUserId" });
        AddColumn("dbo.Listing", "ListedByUserId", c => c.Int(nullable: false));
        AddForeignKey("dbo.Listing", "ListedByUserId", "dbo.User", "UserId", cascadeDelete: true);
        CreateIndex("dbo.Listing", "ListedByUserId");
        DropColumn("dbo.Listing", "OfferedByUserId");
    }

    public override void Down()
    {
        AddColumn("dbo.Listing", "OfferedByUserId", c => c.Int(nullable: false));
        DropIndex("dbo.Listing", new[] { "ListedByUserId" });
        DropForeignKey("dbo.Listing", "ListedByUserId", "dbo.User");
        DropColumn("dbo.Listing", "ListedByUserId");
        CreateIndex("dbo.Listing", "OfferedByUserId");
        AddForeignKey("dbo.Listing", "OfferedByUserId", "dbo.User", "UserId", cascadeDelete: true);
    }
}

その Add-Migration を再度実行すると、そのファイルの Up/Down メソッドはこれらとまったく同じです。

マイグレーションが、ForeignKey 列の名前を変更したことを正しく検出できたことに、非常に感銘を受けました。しかし、それがこれを窒息させているのですか?

回避策があるようです。データベースとすべての移行ファイルを削除し、新しい「初期」移行を作成しましたが、可能であればこれを行いたくありません。

更新:これはこの問題の原因となった最新の移行ではありませんが、問題はマージ後に始まりました (私は一人で作業していますが、git についても学ぶためにブランチでチーム作業をシミュレートしています)、データベースを取得しようとしていますマージ。これは、マージ後に移行を特定の順序で配置したことが原因である可能性があります。ただし、移行、空の DB を指定したときに実行された順序で期待どおりに機能しました。

さらに、この元の移行では、データを古い列から新しい列にコピーする必要があったため、テーブルにデータが含まれていたときに手動で微調整する必要がありました。ただし、そのファイルを手動で編集した場合としない場合でそのファイルをテストしたところ、記載されている動作にまだ遭遇しました。

4

5 に答える 5

36

This answer は、なぜそれが起こるのかを説明しています。それを解決するために、呼び出しadd-migrationて名前を付けてMERGEから、既に発生した重複した移行コードを削除します。これは、マージされたモデルを反映するためにモデルのスナップショットを更新するだけです。

例:

public partial class MERGE : DbMigration
{
    public override void Up()
    {
        // Intentionally left blank.

        // This may seem like a hack, but it is necessary when using source control.
        // When a migration is created via add-migration, EF creates 
        // an .edmx file from the current code first classes. It compares this .edmx to the .edmx stored in the last migration before this, 
        // which I'll call it's parent migration. The edmx snapshots are gzipped and stored in base64 in the resource files (.resx) if you 
        // want to see them. EF uses the difference between these two snapshots to determine what needs to be migrated.

        // When using source control it will happen that two users add entities to the model independently. The generated edmx snapshots will 
        // only have the changes that they have made. When they merge in source control, they will end up with this:

        // Migration                        |  Snapshot Contents
        // -------------------------------- | ----------------
        // 20150101_Parent Migration        |  A
        // 20150102_Developer 1's Migration |  A + Change 1
        // 20150103_Developer 2's Migration |  A + Change 2

        // So calling add-migration will create the current snapshot edmx from the Code First model and compare it to the 
        // the latest migration's snapshot, which is A + Change 2, and see that Change 1 is missing. That is why it 
        // creates a duplicate migration. We know that the migrations have already been applied, so the only thing that this 
        // migration will do is update the current snapshot .edmx so that later migrations work fine.
    }

    public override void Down()
    {

    }
}
于 2015-01-15T11:36:05.513 に答える
0

これは常に役立つ解決策ではありません。すべての回答もお勧めします。

私は同じ問題を抱えていましたが、マイクからの提案は私の場合には当てはまりません。理由がわかった...

移行を含むDLLは、(共有ポイント) 展開の一部であり、GAC (C:\Windows\Microsoft.NET\assembly\GAC_MSIL) にもありまし

GAC から DLL を削除し、Visual Studio を再起動しました。

「update-database」が正しい DLL を取得し、移行が正常に機能するようになりました。

于 2019-08-29T07:48:13.673 に答える
0

私はちょうど同じ問題に直面しました。

移行が作成されたら。データベースを更新しようとしたところ、次のメッセージが表示されました。

保留中の変更があり、自動移行が無効になっているため、現在のモデルに一致するようにデータベースを更新できません。保留中のモデルの変更をコードベースの移行に書き込むか、自動移行を有効にします。自動移行を有効にするには、DbMigrationsConfiguration.AutomaticMigrationsEnabled を true に設定します。Add-Migration コマンドを使用して、保留中のモデルの変更をコードベースの移行に書き込むことができます。

次に、移行を再度生成しましたが、複製されました。

移行を作成した後にプロジェクトをビルドすると、問題は解決しました。次に、Update-Database スクリプトが移行方法を見つけて動作します。少なくとも私の場合は。

于 2014-06-24T13:56:34.763 に答える