コードファーストの移行を実行しています。(EF 4.3.1)
Miniprofiler も実行しています。
App_Start のコードを使用して、コードの最初の移行を実行します。
私のコードは次のようになります。
public static int IsMigrating = 0;
private static void UpdateDatabase()
{
try
{
if (0 == System.Threading.Interlocked.Exchange(ref IsMigrating, 1))
{
try
{
// Automatically migrate database to catch up.
Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("Checking db for pending migrations.")));
var dbMigrator = new DbMigrator(new Ninja.Data.Migrations.Configuration());
var pendingMigrations = string.Join(", ", dbMigrator.GetPendingMigrations().ToArray());
Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("The database needs these code updates: " + pendingMigrations)));
dbMigrator.Update();
Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("Done upgrading database.")));
}
finally
{
System.Threading.Interlocked.Exchange(ref IsMigrating, 0);
}
}
}
catch (System.Data.Entity.Migrations.Infrastructure.AutomaticDataLossException ex)
{
Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(ex));
}
catch (Exception ex)
{
Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(ex));
}
}
問題は、私の DbUpdate が呼び出されようとしているときに、最初の Web ページ要求でアプリから発生したと思われる例外をアプリがスローすることです。
言って:
保留中の変更があり、自動移行が無効になっているため、現在のモデルに一致するようにデータベースを更新できません。保留中のモデルの変更をコードベースの移行に書き込むか、自動移行を有効にします。自動移行を有効にするには、DbMigrationsConfiguration.AutomaticMigrationsEnabled を true に設定します。
問題は、dbupdate が終了する前にホームページが dbcontext とこのエラーを起動していると思うことです。
これを解決するにはどうすればよいでしょうか?
ロックなどを使用してコンテキストを待機させる必要がありますか、それとももっと簡単な方法がありますか?
さらに興味深いことに、アプリを数回起動して停止すると、データベースの変更がプッシュされ、エラーが消えます...
そのため、App_Start でデータベースへの最初のリクエストを移行が行われるまで待機させる方法を見つける必要があります。
考え?