MigrateDatabaseToLatestVersion pas exécuté

Je ne peux pas comprendre pourquoi ma dernière migration n'est pas exécuté automatiquement au démarrage de l'application (ou, au moins, sur première l'accès de la base de données de contexte). J'ai utilisé pour exécuter mise à jour de la base de données manuellement dans le développement, mais je voulez savoir si il sera automatiquement mis à niveau sur mon hébergés environnement de test.

Dans Application_Start():

Database.SetInitializer<FepazoContext>(
    new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>())

Dans FepazoConfiguration:

internal sealed class FepazoConfiguration : 
    DbMigrationsConfiguration<Fepazo.Models.FepazoContext>
{
    public FepazoConfiguration()
    {
        AutomaticMigrationsEnabled = true;
    }
}

J'ai même ajouté à cela le constructeur de FepazoContext:

public FepazoContext() : base("DefaultConnection")
{
    Database.Initialize(false);
}

Quelques informations supplémentaires:

  • La migration a été créé automatiquement par ajoutez-la migration et semble ok.
  • Quand j'ai une requête à la __MigrationHistory table, je peux voir que la migration n'est pas encore "enregistré" comme exécutées.
  • J'ai vérifié que l'initialiseur, ou le AutomaticMigrationsEnabled paramètre n'est pas remplacée dans le Web.fichier de configuration.
  • Des points d'arrêt dans FepazoContext constructeur et le FepazoConfiguration sont se faire frapper.

Suis-je oublier quelque chose ? Puis-je creuser plus profond pour trouver où ça se passe mal ?

Mises à jour

Passant True à Database.Initialize tenter de forcer la migration n'a pas d'effet. Database.CompatibleWithModel(true) retourne faux si le système détecte une différence existe, cependant il n'exécute pas l'attente de la migration!

public FepazoContext() : base("DefaultConnection")
{
    if (!Database.CompatibleWithModel(true))
    {
        //This is executed (each time the code enters)
        Database.Initialize(true);
    }
}

Solution de contournement

Comme une solution de contournement, j'appelle DbMigrator.Update() explicitement à droite après la mise à l'initialiseur. Que fait le truc, bien que je voudrais encore savoir pourquoi ça ne fonctionne pas automatiquement...

protected void Application_Start()
{
    //<...>
    Database.SetInitializer<FepazoContext>(
        new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>());
    var dbMigrator = new DbMigrator(new FepazoConfiguration());
    dbMigrator.Update();
    //<...>
}

OriginalL'auteur Vincent Sels | 2013-08-31