Каков наилучший способ выполнить все необходимые миграции db при запуске приложения с EF 4.3?
Entity framework 4.3 запускает миграцию при запуске приложения
Ответ 1
Лучший способ - использовать новый инициализатор MigrateDatabaseToLatestVersion
.
Database.SetInitializer<YourContext>(
new MigrateDatabaseToLatestVersion<YourContext, YourMigrationsConfig>());
Database.Initialize(false);
Ответ 2
Отличное описание параметров конфигурации EF 4.3 можно найти на EF 4.3 Настройки файла конфигурации на блог команды ADO.NET. В последнем разделе описаны инициализаторы базы данных, в том числе новый инициализатор первого кода <1 > .
Несмотря на то, что Entity Framework, как и многие другие функции .NET 4.x, поддерживает соглашение по конфигурации, это один из примеров, когда было бы очень полезно установить инициализатор базы данных MigrateDatabaseToLatestVersion
через файл конфигурации приложения, а не явно скопируйте его в свое приложение.
Ответ 3
Мне нужно было сделать это явно, потому что я использую 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));
}
}