アプリケーションの起動時 (または少なくともデータベース コンテキストの最初のアクセス時) に、最新の移行が自動的に実行されない理由がわかりません。以前は開発中にupdate-databaseを手動で実行していましたが、ホストされているテスト環境で自動的にアップグレードされるかどうかをテストしたいと考えています。
Application_Start() で:
Database.SetInitializer<FepazoContext>(
new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>())
FepazoConfiguration:
internal sealed class FepazoConfiguration :
DbMigrationsConfiguration<Fepazo.Models.FepazoContext>
{
public FepazoConfiguration()
{
AutomaticMigrationsEnabled = true;
}
}
これを FepazoContext のコンストラクターに追加しました。
public FepazoContext() : base("DefaultConnection")
{
Database.Initialize(false);
}
追加情報:
- 移行はadd-migrationによって自動的に作成され、問題ないように見えます。
- テーブルにクエリを実行する
__MigrationHistory
と、移行がまだ実行済みとして「記録」されていないことがわかります。 AutomaticMigrationsEnabled
初期化子または設定が Web.config ファイルでオーバーライドされていないことを確認しました。FepazoContext
コンストラクターとのブレークポイントFepazoConfiguration
がヒットしています。
私は何かを忘れていますか?どこが間違っているかを調べるために、もっと深く掘り下げることはできますか?
アップデート
に渡しTrue
てDatabase.Initialize
移行を強制しようとしても効果はありません。Database.CompatibleWithModel(true)
false を返す - システムは違いがあることを検出しますが、保留中の移行は実行しません。
public FepazoContext() : base("DefaultConnection")
{
if (!Database.CompatibleWithModel(true))
{
// This is executed (each time the code enters)
Database.Initialize(true);
}
}
回避策
DbMigrator.Update()
回避策として、初期化子を設定した直後に明示的に呼び出します。それはうまくいきますが、自動的に機能しない理由を知りたいのですが...
protected void Application_Start()
{
// <...>
Database.SetInitializer<FepazoContext>(
new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>());
var dbMigrator = new DbMigrator(new FepazoConfiguration());
dbMigrator.Update();
// <...>
}