34 votes

Entity framework 4.3 exécute les migrations au démarrage de l'application

Quelle est la meilleure façon d'exécuter toutes les migrations de données nécessaires au démarrage de l'application avec EF 4.3 ?

54voto

Ladislav Mrnka Points 218632

Le meilleur moyen est d'utiliser les nouvelles MigrateDatabaseToLatestVersion initialisateur.

Database.SetInitializer<YourContext>(
    new MigrateDatabaseToLatestVersion<YourContext, YourMigrationsConfig>());
Database.Initialize(false);

6voto

Boris Nikolaevich Points 920

Une excellente description des options de configuration d'EF 4.3 est disponible à l'adresse suivante EF 4.3 Paramètres du fichier de configuration sur le blog de l'équipe ADO.NET. La toute dernière section décrit les initialisateurs de base de données, y compris le nouveau code First. MigrateDatabaseToLatestVersion initialisateur.

Bien qu'Entity Framework, comme tant d'autres fonctionnalités de .NET 4.x, privilégie les conventions par rapport à la configuration, il s'agit d'un cas où il peut être très utile de définir l'attribut MigrateDatabaseToLatestVersion par le biais du fichier de configuration de votre application plutôt que de le coder explicitement dans votre application.

4voto

Scott Stafford Points 13161

J'ai dû le faire explicitement, car j'utilise un uber-contexte pour la migration, un superset des autres migrations. Le point clé est :

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

Avec un soupçon de journalisation Elmah, j'utilise en fait ceci, appelé depuis Application_Start(). Des parties de ce programme ont été volées aux idées d'autres personnes. Je ne suis pas sûr que la partie "thread-safety Interlocked" soit nécessaire.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X