EF 4.3 でアプリケーションを起動するときに必要なすべてのデータベース移行を実行する最善の方法は何ですか?
3 に答える
最善の方法は、新しいMigrateDatabaseToLatestVersion
初期化子を使用することです。
Database.SetInitializer<YourContext>(
new MigrateDatabaseToLatestVersion<YourContext, YourMigrationsConfig>());
Database.Initialize(false);
EF 4.3 構成オプションの詳細な説明は、ADO.NET チーム ブログのEF 4.3 構成ファイルの設定にあります。最後のセクションでは、新しい Code FirstMigrateDatabaseToLatestVersion
初期化子を含むデータベース初期化子について説明します。
Entity Framework は、.NET 4.x の他の多くの機能と同様に、構成よりも規則を優先しますが、これはMigrateDatabaseToLatestVersion
、アプリケーションに明示的にコーディングするよりも、アプリケーションの構成ファイルを使用してデータベース初期化子を設定する方が非常に役立つ場合がある 1 つのケースです。
移行には、他の移行のスーパーセットである uber-context を使用するため、明示的に行う必要がありました。重要なビットは次のとおりです。
var dbMigrator = new System.Data.Entity.Migrations.DbMigrator(
new Lcmp.EF.Migrations.Migrations.Configuration());
dbMigrator.Update();
Elmah ロギングを少し加えて、Application_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 System.Data.Entity.Migrations.DbMigrator(new Lcmp.EF.Migrations.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));
}
}