Entity Framework 4.3 запускает миграции при запуске приложения - PullRequest
33 голосов
/ 14 февраля 2012

Каков наилучший способ выполнить все необходимые миграции БД при запуске приложения с EF 4.3?

Ответы [ 3 ]

53 голосов
/ 15 февраля 2012

Лучше всего использовать новый инициализатор MigrateDatabaseToLatestVersion.

Database.SetInitializer<YourContext>(
    new MigrateDatabaseToLatestVersion<YourContext, YourMigrationsConfig>());
Database.Initialize(false);
6 голосов
/ 16 февраля 2012

Отличное описание параметров конфигурации EF 4.3 можно найти по адресу Параметры файла конфигурации EF 4.3 в блоге команды ADO.NET.В самом последнем разделе описываются инициализаторы базы данных, включая новый инициализатор Code First MigrateDatabaseToLatestVersion.

Хотя Entity Framework, как и многие другие функции .NET 4.x, предпочитает соглашение по конфигурации, это один случай, когдаможет быть очень полезно установить инициализатор базы данных MigrateDatabaseToLatestVersion через файл конфигурации вашего приложения, а не явно кодировать его в свое приложение.

4 голосов
/ 25 мая 2012

Мне нужно было сделать это явно, потому что я использую 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));
    }
}
...