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 leFepazoConfiguration
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
Vous devez vous connecter pour publier un commentaire.
Selon une autre réponse ici l'initialiseur de ne pas courir jusqu'à il y a peu d'interaction avec la base de données. La réponse explique comment forcer l'initialiseur de s'exécuter immédiatement.
Database.Initialize(true);
sans effet. Malheureusement, la solution à ce problème n'est pas simple 😉Wow, j'ai passer 15 min à la recherche sur cette question, alors que je commençais mon app, mais pas la connexion (/en interaction avec la demande), en effet, il doit interagir avec DB pour effectuer la migration : ')
OriginalL'auteur Appetere
Dans l'extrait de code ci-dessus vous appelez le Base de données.Initialize() méthode immédiatement après la création d'une instance de contexte. Dans ce cas, la base de données sera créé immédiatement après l'appel de la méthode Initialize() au lieu d'attendre jusqu'à ce que le contexte est utilisé pour la première fois.
La méthode Initialize() prend un paramètre Booléen qui détermine si le processus d'initialisation de re-exécuter si elle a déjà été exécuté pour l'application.
Précisant faux ignorer le processus d'initialisation si elle a déjà été exécutée. Une valeur de vrai d'initialiser la base de données à nouveau, même si elle a déjà été initialisé.
true
comme paramètre àDatabase.Initialize()
forcer la mise à niveau, mais même cela n'a pas l'exécuter.OriginalL'auteur SeyedPooya Soofbaf
J'ai eu cette question. Mon problème s'est avéré être que j'ai eu un MigrationsContextFactory qui a été utilisé pour fournir de la chaîne de connexion. Lors de l'initialisation de la base était survenu le contexte de la migration de l'usine a été appelé. Cette MigrationsContextFactory a été d'obtenir une chaîne de connexion à une base de données différente et était de s'assurer que c'était jusqu'à ce jour.
J'ai enlevé le MigrationsContextFactory et passé fidèle à
MigrateDatabaseToLatestVersion<,>
Migrator pour lui dire d'utiliser le contexte actuel. Voir cette question en haut voté réponse Comment puis-je injecter une chaîne de connexion à une instance de IDbContextFactory<T>?IDatabaseInitializer<TContext>.InitializeDatabase(TContext)
accepté unTContext
paramètre il a toujours juste l'utilisation fournis contexte. Tous les autres intégrée dans les initialiseurs de ne même pas avoir le choix, donc c'est bizarre qu'ils m'ont un comportement incohérent avec le reste du cadre. (Désolé pour le délire).OriginalL'auteur GraemeMiller
Assurez-vous que le MigrateDatabaseToLatestVersion sera en utilisant le bon contexte que l'application utilise. Ceci est fait en utilisant le paramètre useSuppliedContext.
Après ce changement, mon application MVC n'mise à jour de ma base de données.
OriginalL'auteur Koen van der Linden