13

アプリケーションの起動時 (または少なくともデータベース コンテキストの最初のアクセス時) に、最新の移行が自動的に実行されない理由がわかりません。以前は開発中に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 ヒットしています。

私は何かを忘れていますか?どこが間違っているかを調べるために、もっと深く掘り下げることはできますか?

アップデート

に渡しTrueDatabase.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();
    // <...>
}
4

4 に答える 4

2

上記のコード スニペットでは、コンテキスト インスタンスを作成した直後にDatabase.Initialize()メソッドを呼び出しています。この場合、コンテキストが初めて使用されるまで待機するのではなく、Initialize() メソッドを呼び出した直後にデータベースが作成されます。

Initialize() メソッドは、アプリケーションに対して初期化プロセスがすでに実行されている場合に、初期化プロセスを再実行するかどうかを制御するブール値パラメーターを取ります。

falseを指定すると、初期化プロセスが既に実行されている場合はスキップされます。trueの値は、データベースが既に初期化されている場合でも、データベースを再度初期化します。

于 2013-09-01T07:22:22.500 に答える