34

EF 4.3 でアプリケーションを起動するときに必要なすべてのデータベース移行を実行する最善の方法は何ですか?

4

3 に答える 3

54

最善の方法は、新しいMigrateDatabaseToLatestVersion初期化子を使用することです。

Database.SetInitializer<YourContext>(
    new MigrateDatabaseToLatestVersion<YourContext, YourMigrationsConfig>());
Database.Initialize(false);
于 2012-02-14T21:30:29.293 に答える
6

EF 4.3 構成オプションの詳細な説明は、ADO.NET チーム ブログのEF 4.3 構成ファイルの設定にあります。最後のセクションでは、新しい Code FirstMigrateDatabaseToLatestVersion初期化子を含むデータベース初期化子について説明します。

Entity Framework は、.NET 4.x の他の多くの機能と同様に、構成よりも規則を優先しますが、これはMigrateDatabaseToLatestVersion、アプリケーションに明示的にコーディングするよりも、アプリケーションの構成ファイルを使用してデータベース初期化子を設定する方が非常に役立つ場合がある 1 つのケースです。

于 2012-02-16T17:40:20.037 に答える
4

移行には、他の移行のスーパーセットである 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));
    }
}
于 2012-05-24T21:50:32.513 に答える