私が問題を抱えているシナリオは次のとおりです。
- EF 4.1を使用して作成されたコードファーストモデルと、生成された対応するデータベース
- EFが4.3.1にアップグレードされ、移行が追加され(モデルが変更されていないため、IgnoreChangesを使用)、移行の使用を開始します(__MigrtionHistoryテーブルが作成され、EdmMetadataが削除されました)-「InitialMigration」と呼びましょう
- モデルが変更され、新しいプロパティが追加され、対応する列を追加する移行が生成され(これを「NewPropertyMigration」と呼びます)、Devデータベースに適用されます(Migrate ToLatest初期化戦略のバージョンを使用)
- コードが本番環境にプロモートされると、データベースは期待どおりに新しい列で更新されます
- 次に、新しいデータベースがDevで作成され、最新のモデルに基づいているため、作成直後に新しい列が含まれますが、初期化戦略を実行すると、「InitialMigration」と「NewPropertyMigration」は保留中として検出されますが、 EdmMetadataが存在しないため、削除するものがなく、新しい列がすでに存在するため、両方とも失敗します。追加できません。
この新しいデータベースの__MigrationHistoryテーブルを確認すると、「InitialCreate」エントリのみが含まれているため、他の2つの移行が保留中と見なされる理由が説明されます。しかし、適用せずにこのテーブルに入る方法がわかりません。同時に、データベースにはすでに適用される変更が含まれているため、実際に適用する必要はありません。私は何が欠けていますか?
同じモデルを表しているにもかかわらず、「InitialCreate」の「Model」列が「NewPropertyMigration」の「Model」列と異なるのは少し疑わしいようです。それが原因でしょうか?
更新:これは、新しいデータベースを作成し、同時に移行を自動的に適用するために使用するコードです
public class MigratePaymentsToLatestVersion<TContext> : IDatabaseInitializer<TContext> where TContext : DbContext
{
public void InitializeDatabase(TContext context)
{
// Create a brand new database if it doesn't exist but still apply any pending migrations
context.Database.CreateIfNotExists();
var migrator = new DbMigrator(configuration);
migrator.Update();
}
}
更新2:同じ問題を示すより単純なシナリオ
これをさらに調査している間、私は以下に説明するはるかに単純なシナリオで動作を再現することができました。
- シンプルなモデルとコンテキストを作成する
- テストアプリケーションで、1つのエンティティを追加します-すべてのデフォルト設定でデータベースが自動的に作成され、オブジェクトが追加されます
- 移行を有効にする-'InitialCreate'移行が生成されます
- Update-Database-'InitialCreation'はすでに__MigrationHistoryにあるため、コマンドは保留中の移行を返しません
- データベースを削除してテストアプリケーションを再実行します-データベースは自動的に再作成されます
- この時点では、「InitialCreation」の移行は保留中と見なされるため、追加の移行を追加したり、update-databaseを実行したりすることはできませんが、すべてのエンティティがすでに存在するため、適用できません。