Entity framework 4.3 ejecuta migraciones al inicio de la aplicación


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

Author: Ladislav Mrnka, 2012-02-14

3 answers

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

Database.SetInitializer<YourContext>(
    new MigrateDatabaseToLatestVersion<YourContext, YourMigrationsConfig>());
Database.Initialize(false);
 51
Author: Ladislav Mrnka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-14 21:30:29

Una gran descripción de las opciones de configuración de EF 4.3 se puede encontrar en EF 4.3 Configuration File Settings en el ADO.NET blog del equipo. La última sección describe Inicializadores de base de datos, incluyendo el inicializador new Code First MigrateDatabaseToLatestVersion.

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

 6
Author: Boris Nikolaevich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-16 17:40:20

Necesitaba hacerlo explícitamente, porque uso un uber-contexto para la migración, un superconjunto de las otras migraciones. El bit 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(). Partes de ella son robadas de las ideas de otros. No estoy seguro de que la parte entrelazada de seguridad del 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));
    }
}
 4
Author: Scott Stafford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-24 21:50:32