Marco de entidad 4.3 ejecutar migraciones al inicio de la aplicación

¿Cuál es la mejor manera de ejecutar todas las migraciones de bases de datos requeridas al inicio de la aplicación con EF 4.3?

La mejor forma debería ser usar el nuevo inicializador MigrateDatabaseToLatestVersion .

 Database.SetInitializer( new MigrateDatabaseToLatestVersion()); Database.Initialize(false); 

Una gran descripción de las opciones de configuración de EF 4.3 se puede encontrar en EF 4.3 Configuración del archivo de configuración en el blog del equipo ADO.NET. La última sección describe los inicializadores de base de datos, incluido el nuevo inicializador de MigrateDatabaseToLatestVersion Code First.

Aunque Entity Framework -como muchas otras características de .NET 4.x- favorece la convención sobre la configuración, este es un caso donde podría ser muy útil establecer el inicializador de base de datos MigrateDatabaseToLatestVersion través del archivo de configuración de la aplicación en lugar de codificarlo explícitamente en su aplicación .

Necesitaba hacerlo explícitamente, porque utilizo un contexto uber para migración, un superconjunto de las otras migraciones. La clave es:

 var dbMigrator = new System.Data.Entity.Migrations.DbMigrator( new Lcmp.EF.Migrations.Migrations.Configuration()); dbMigrator.Update(); 

Con una pizca de registro de Elmah, realmente uso esto, llamado desde Application_Start (). Se roban fragmentos de las ideas de los demás. No estoy seguro de que la pieza enclavada de seguridad de hilo sea necesaria.

 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)); } }