Impossible de générer une migration explicite dans le cadre d'entité

96

J'ajoute une nouvelle migration mais ce message montre:

Impossible de générer une migration explicite car les migrations explicites suivantes sont en attente: [201203170856167_left]. Appliquez les migrations explicites en attente avant de tenter de générer une nouvelle migration explicite.

Quelqu'un peut-il m'aider?

Noman Saeed
la source
11
Cela m'est arrivé lorsque j'avais accidentellement changé mon projet de démarrage en un autre. Vous (ou d'autres personnes lisant ceci) voudrez peut-être vérifier cela rapidement avant d'essayer un dépannage plus approfondi (en particulier ceux où vous devez commencer à supprimer des migrations, etc.).
NicholasFolk
Il existe une classe de migration dans le répertoire Migrations qui n'est pas mise à jour dans la _MigrationHistory de la base de données. La suppression de cette classe pour avoir le même état dans le répertoire de migration et la base de données a résolu mon problème.
Aryan Firouzian
1
Cela m'arrive au hasard. Quand cela se produit, cela montre que toutes mes migrations doivent être appliquées. Je dois redémarrer Visual Studio pour le faire fonctionner car j'ai déjà tout configuré correctement.
Larry Flewwelling

Réponses:

81

Il vous indique qu'il existe une migration non traitée dans votre application et qu'elle doit être exécutée Update-Databaseavant que vous puissiez ajouter une autre migration.

Ladislav Mrnka
la source
12
Qu'est-ce que je veux recréer une migration initiale? Cela vous empêche de le faire?
Rebecca
Cela n'a pas fonctionné pour moi, Update-Database m'a juste donné une autre erreur. J'ai d'abord dû supprimer les fichiers en attente.
Vahx
1
La réponse de Thomas a été la plus utile pour mon cas similaire.
Tarek Shawadfy
2
Il peut être nécessaire de déclarer un projet de démarrage-StartupProject ContentHub.Database
osanger
2
Update-Databasedonne> Impossible de mettre à jour la base de données pour qu'elle corresponde au modèle actuel car des modifications sont en attente
ASpirine
53

J'ai eu le même problème. Apparemment, le cadre d'entité génère cette erreur lorsqu'il ne peut pas se connecter à la base de données. Assurez-vous donc de pouvoir y accéder avant de rechercher d'autres problèmes.

Robin Dorbell
la source
1
J'ajouterais également que ce serait le cas lorsque vous déplacez votre App.config vers un autre projet ou s'il est tout simplement absent de votre projet ou s'il est dans votre projet mais qu'il est configuré de manière incorrecte.
Code Maverick
J'ai eu cette même erreur après le changement de mon adresse IP (survenue à la fois après le changement d'emplacement et après un changement de dyn dns). Cela a provoqué le pare-feu dans la base de données Azure que nous utilisons pour révoquer la connexion. Les migrations EF inutiles donnent l'erreur ci-dessus au lieu de "Impossible de se connecter" ...
Victor
8
Un autre point que je voudrais faire est de m'assurer que votre projet de démarrage en est un avec la chaîne de connexion de votre contexte db. J'ai eu ce problème lorsque j'ai temporairement modifié mon projet de démarrage et que je ne me suis pas rendu compte que l'autre projet n'avait pas la même chaîne de connexion.
Gage Trader
Ajout à @GageTrader: j'avais plusieurs projets de démarrage, un sans configuration, et un projet Web avec EF-config. le projet (Repository) avec migrations a la même configuration EF dans son app.config que le projet Web. mais même lorsque j'ai sélectionné le projet de référentiel comme projet de démarrage, cela n'a pas fonctionné, mais lorsque j'ai mis le projet Web au démarrage, cela a fonctionné.
JimiSweden
J'ai dû indiquer explicitement le paramètre -ConnectionString, ce qui a fait l'affaire pour moi
Brian Colavito
34

Vous devez soit exécuter «update-database» à partir de la console du gestionnaire de packages pour transférer vos modifications dans la base de données, soit supprimer le fichier de migration en attente ([201203170856167_left]) de votre dossier Migrations, puis relancer «add-migration» vers créez une toute nouvelle migration basée sur vos modifications.

socketman
la source
1
J'ai supprimé le fichier de migration et exécuté add-migration, mais cela donne toujours la même erreur.
nu everest
2
Merci, le conseil sur la suppression du fichier de migration en attente a été une bouée de sauvetage
Manish
31

Cette erreur peut également signifier que les migrations ne sont plus reconnues. Cela m'est arrivé après avoir modifié la valeur de ContextKey dans Migrations.Configuration. La solution était simplement de mettre à jour la ContextKey dans la table de base de données "__MigrationHistory" (ou de rétablir la valeur dans la classe de configuration je suppose). La ContextKey et le Namespace de votre application doivent correspondre.

Thomas
la source
1
C'était la bonne réponse pour mon cas. Comme j'ai utilisé l'un de mes anciens projets pour un nouveau projet similaire, je n'ai pas pu apporter de modifications à la base de données par rapport aux anciennes migrations. Comme Thomas l'a suggéré, l'espace de noms était différent dans les migrations de la clé de contexte dans la table _MigrationsHistory, ce qui empêchait les anciennes migrations d'être reconnues.
Tarek Shawadfy
1
Cela m'a aidé car j'ai causé le problème en renommant la solution. Dans le processus, j'avais renommé la ContextKey pour qu'elle ne corresponde plus aux entrées _MigrationHistory.
Joel le
J'ai également travaillé pour moi, définir une clé de contexte explicite dans la configuration, la modifier dans __MigrationHistory et la base de données de mise à jour a décidé que tout était cool. Merci!
James White
2
Ridicule, mais c'est vrai. Si vous avez mis à jour le nom du projet, ou si vous divisez votre projet (mon cas) en quelques-uns et que vous essayez d'ajouter une nouvelle migration d'un nouveau projet vers la même base de données, vous devez utiliser ContextKey correct, vous pouvez le définir dans le constructeur de configuration ( vous devez utiliser la clé de contexte que vous avez dans la table __MigrationHistory dans la base de données cible)
BotanMan
même ici, j'ai renommé mon espace de nom par défaut et l'ai remplacé tout au long de ma solution, ce qui a causé ce problème
WtFudgE
19

1. Chaîne de connexion / autorisations de connexion

Vérifiez à nouveau la chaîne de connexion.

Assurez-vous que l'utilisateur avec lequel vous vous connectez est toujours autorisé à lire [__MigrationHistory]et à modifier le schéma.

Vous pouvez également essayer de modifier la chaîne de connexion dans le fichier de configuration d'application ou Web pour utiliser Integrated Security (Windows Auth) pour exécuter la commande add-migration comme vous-même .

Par exemple:

connectionString="data source=server;initial catalog=db;persist security info=True;Integrated Security=SSPI;" 

Cette chaîne de connexion irait dans le fichier App.config du projet où se trouve le DbContext.

2. Projet de démarrage

Vous pouvez spécifier le projet de démarrage sur la ligne de commande ou vous pouvez cliquer avec le bouton droit sur le projet avec le dossier DbContext, Configurationet Migrations et sélectionner Définir comme projet de démarrage . Je suis sérieux, cela peut vraiment aider.

entrez la description de l'image ici

Jess
la source
Haha. Je souhaite que cela suscite plus de votes. Cela m'arrive souvent et le Integrated Securitycorrectif fonctionne très bien!
Jess
1
J'ai eu le même problème, aucune des commandes de migration n'a fonctionné. Il s'avère que le fait de ne pas définir le projet de démarrage était le coupable. Cela a résolu mon problème.
Vishal
Changer le projet de démarrage a fonctionné pour moi! J'étais sûr que cela ne fonctionnerait pas mais je l'ai essayé quand même car tout le reste a échoué. Très bonne réponse.
Sylvain Rodrigue
"Définir comme démarrage" - je n'aurais jamais deviné! Je vous remercie!!
Jasel
1
Oui, j'ai intentionnellement changé le projet de démarrage et oublié de le modifier. Et drôle, c'est qu'une migration avant a été effectuée avec un projet de démarrage approprié, donc tout fonctionnait bien. Mais c'est logique maintenant - b / c EF prend la chaîne de connexion du projet, donc il "ne sait pas" que les migrations sont déjà appliquées à DB ...
kosist
8

J'ai eu le même problème et a pu le résoudre avec quelques indices des réponses ci-dessus:

  • Dans la console du gestionnaire de packages, vérifiez le projet par défaut (pointez sur le projet avec la configuration de migration
  • Assurez-vous que startup-proj a un web.config avec une chaîne de connexion valide (ou
  • Assurez-vous que le projet avec les migrations a un app.config / web.config avec une chaîne de connexion valide
  • Vérifiez les autorisations dans la base de données (pour l'utilisateur configuré dans votre chaîne de connexion)

Utilisez "update-database -verbose" dans la console du gestionnaire de packages pour obtenir des informations plus spécifiques sur les sites auxquels les migrations tentent de se connecter. (J'ai aidé dans mon cas à découvrir que mon projet de démarrage n'était pas défini correctement ...)

fléchir
la source
2
a couru "update-database -verbose" et a remarqué que ma chaîne de connexion était cassée, lol. La commande add-migration donne donc le mauvais message.
Wachburn
4
"Assurez-vous que le startup-proj {...}" a résolu mon problème. Merci @flex
Andy Schmitt
7

Lorsque vous rencontrez ce problème, essayez d'ajouter des paramètres à votre applet de commande add-migration. Par exemple, la spécification du projet de démarrage ainsi que le nom de la chaîne de connexion peut aider EF à trouver votre base de données cible.

add-migration Delta_Defect_0973 -ConfigurationTypeName your.namespace.ContextClassName -StartUpProject DeltaProject -ConnectionStringName DeltaSQL

Où:

Delta_Defect_0973 est le nom de votre migration

your.namespace.ContextClassName est le nom de votre classe de configuration dans votre dossier de migration, précédé de l'espace de nom complet.

DeltaProject est le nom de votre projet principal avec votre fichier web.config ou app.config.

DeltaSQL est le nom de votre chaîne de connexion définie dans votre fichier web.config ou app.config.

Yves Rochon
la source
Merci. Cela m'a vraiment aidé.
Jess
En outre, si vous utilisez l'injection de dépendances dans votre solution, vous devrez peut-être sélectionner un autre projet par défaut dans la console du gestionnaire de package. Si EF ne parvient pas à localiser vos migrations, essayez de sélectionner le projet qui contient réellement les migrations comme projet par défaut.
Yves Rochon
5

Cette erreur signifie que des migrations en attente doivent être validées avant de pouvoir exécuter une autre migration explicite. Vous pouvez choisir de

  1. Exécutez ces migrations en attente à l'aide de la commande Update-Database
  2. Supprimez ces migrations en attente. Le moyen le plus sûr est d'ouvrir le dossier Migrations, cliquez avec le bouton droit sur [201203170856167_left]> Exclure du projet

Après celui-ci, vous pouvez recommencer "Add-Migration ..."

J'espère que ça aide

Hung Vu
la source
4

Juste mes deux cents:

Mon scénario:

  1. J'ai restauré ma base de données locale à un état de fonctionnement.
  2. Des migrations y étaient déjà appliquées.
  3. Chaque fois que j'ai essayé d'ajouter une nouvelle migration, j'ai eu l'erreur sur les migrations en attente, comme mentionné dans mon OP.

Solution:

Pour contourner ce problème, je viens de fournir des paramètres plus explicites:

Add-Migration -ConnectionString "Server=localhost\SQLEXPRESS;Database=YourDataBase;Trusted_Connection=True;" -ConnectionProviderName "System.Data.SqlClient" -verbose

Je suis amené à croire que vous pouvez définir un paramètre dans votre dossier app.config pour vous permettre de définir ce comportement par défaut afin que vous n'ayez pas à fournir des paramètres explicites à chaque fois. Cependant, je ne sais pas comment procéder.

IbrarMumtaz
la source
1
Cela a fonctionné pour moi, je viens d'ajouter le nom de la migration à la fin de la commande ci-dessus.
sfors dit de réintégrer Monica
1
=) - heureux de pouvoir aider.
IbrarMumtaz
1
-ConnectionStringNameest une alternative à cela, et tirera la chaîne de connexion de votre configuration par nom
Simon_Weaver
1
Cela m'a aidé car je ne stocke pas la chaîne de connexion dans le fichier de configuration
Sasinosoft
3

Il y a une ambiguïté et donc une erreur. Le meilleur moyen est d'exclure le fichier de migration actuel et de créer un nouveau fichier de migration ( add-migration ), puis de copier le contenu de la nouvelle migration dans le fichier exclu et de l'inclure à nouveau et d'exécuter la commande update-database .

Sachin Cholkar
la source
J'ai juste exécuté la update-databasecommande puis réessayé ma add-migrationcommande et cela a fonctionné
Smitty-Werben-Jager-Manjenson
3

J'ai résolu le même problème comme ceci:

  • supprimer l'ancien fichier de migration
  • update-database -force
  • Add-Migration AddedEntity
  • base de données de mise à jour
yilmazdincsoy
la source
1

J'ai eu les mêmes problèmes et je n'ai pu le résoudre qu'en exécutant Add-Migration 'MigrationName' -Force

Avec -Force étant la partie importante.

Evan Barke
la source
1

Ma base de données locale ne contenait pas le __MigrationHistoryfichier. J'ai créé manuellement la table, puis j'ai migré les données de cette table de PROD vers ma base de données locale. Cela a amené VS à penser que les migrations avaient été appliquées (ce qu'elles avaient été).

contactmatt
la source
J'ai eu le même problème, j'ai fusionné ma base de données en direct dans la production mais par conséquent, l'historique de la migration a été perdu.
matthy
1

Conseil: il est toujours bon d'utiliser le -Scriptcommutateur pour les commandes de migration si vous n'êtes pas sûr. Cela aide aussi vraiment à comprendre ce que Update-Databasefait réellement.

J'exécute ce qui suit pour mettre à jour la base de données, puis j'obtiens un script que je peux appliquer manuellement (ou simplement le réexécuter sans la balise -Script).

Car Update-Databaseje lancerais ce qui suit:

Update-Database -Script -ConfigurationTypeName Configuration_ASPNETIdentity -ConnectionStringName SQL_AzureLive

SQL_AzureLiveest la chaîne de connexion nommée dans ma configuration.

Ensuite, je peux vérifier que le SQL semble correct, l'appliquer et faire. Comme beaucoup d'autres l'ont dit, si la chaîne de connexion est incorrecte ou invalide, vous obtiendrez cette erreur.

Simon_Weaver
la source
1

Pour moi, j'ai supprimé le fichier de migration (dans votre cas "201203170856167_left") du Migrationsdossier, puis j'ai exécuté la commande ci-dessous dans la console du gestionnaire de package

Add-Migration <Parameter>
Update-Database
Surendra Mourya
la source
0

Scénario

  • Je travaille dans une branche dans laquelle j'ai créé une nouvelle migration DB.
  • Je suis prêt à mettre à jour à partir du maître, mais le maître a également une migration de base de données récente.
  • Je supprime la migration de la base de données de ma branche pour éviter les conflits.
  • Je "mise à jour du maître".

Problème

Après la mise à jour à partir du maître, j'exécute «Add-Migration my_migration_name», mais j'obtiens l'erreur suivante:

Impossible de générer une migration explicite car les migrations explicites suivantes sont en attente: [201607181944091_AddExternalEmailActivity]. Appliquez les migrations explicites en attente avant de tenter de générer une nouvelle migration explicite.

Donc, j'exécute "Update-Database" et j'obtiens l'erreur suivante:

Impossible de mettre à jour la base de données pour qu'elle corresponde au modèle actuel car des modifications sont en attente et la migration automatique est désactivée

Solution

À ce stade, la réexécution de "Add-Migration my_migration_name" a résolu mon problème. Ma théorie est que l'exécution de "Update-Database" a tout dans l'état nécessaire pour que "Add-Migration" fonctionne.

Tod Birdsall
la source
0

Je suis également tombé sur ce problème. Il est venu lorsque j'ai créé une nouvelle base de données et que j'avais des modifications en attente pour ma migration de base de données code-first, puis j'ai essayé d'exécuter la commande "Update-Database". Solution: exécutez la commande "Add-Migration -MigrationName" pour créer une nouvelle migration pour la nouvelle base de données. Exécutez ensuite la commande "Update-Database".

Pritam
la source
0

J'ai également eu ce problème pour une base de données dont je savais qu'elle était à jour lors de l'exécution d'Add-Migration. Résolu en exécutant simplement la commande Add-Migration une deuxième fois. Suspectez un problème de connectivité, comme suggéré par Robin Dorbell ci-dessus.

spadelives
la source
Dans mon scénario, le nom de la base de données était sensible à la casse lors de l'exécution de la commande. dès que la
chaîne de
0

Cela s'est produit lorsque j'ai soudainement renommé la classe de l'ancienne migration qui existe déjà dans db. J'ai vérifié l'historique du VCS, déterminé cela et renommé. Tout a fonctionné par la suite.

Docteur Coder
la source
0

J'ai fait une autre manière. J'ai complètement abandonné la base de données et réexécuté "update-database" dans vs.

Ghadir Farzaneh
la source
Cela ne fournit pas de solution viable; la migration valide conserve la structure existante.
Ferdipux
0

J'ai eu un problème plus simple. VS a signalé cette erreur par erreur lorsque j'avais une connexion VPN au site d'un client connecté sur mon poste de travail. Le problème était que la sécurité du SGBD était configurée pour n'accepter que les demandes provenant de ma véritable adresse IP locale. La simple désactivation du VPN a résolu le problème.

spadelives
la source
0

Dans mon cas, j'ai oublié d'ajouter mon adresse IP dans les règles de pare-feu dans Azure, car je n'ai pas pu me connecter à la base de données, j'obtenais cette erreur. Donc, spécifiquement pour mon cas, j'ai ajouté mon adresse IP dans les règles de pare-feu de base de données dans Azure et tout a bien fonctionné. En dehors de cela, il pourrait s'agir du problème du proxy / connexion Internet / mot de passe du nom d'utilisateur de la base de données / chaîne de connexion de la base de données, etc. OU évidemment, vous pourriez avoir des migrations en attente pour lesquelles vous devez exécuter la commande Update-Database.

Siddharth Sachdeva
la source
0

Historiquement, j'ai toujours résolu ce problème en supprimant les migrations en attente, ou s'il n'en restait qu'une seule et c'était surtout souhaitable, en utilisant -fpour le recréer.

Récemment, cela a cessé de fonctionner pour moi.

Lorsque cela s'est produit la première fois, j'ai redémarré Visual Studio, puis cela m'a permis de continuer.

La deuxième fois, cela n'a fonctionné qu'après avoir exécuté un nettoyage du projet. C'était presque comme si les migrations en attente étaient conservées malgré la suppression de tous les fichiers de l'explorateur.

Adam Marshall
la source
0

Cela ne sera pas la réponse pour beaucoup de gens, mais EF rejettera cette erreur lorsqu'il ne pourra pas se connecter à la base de données. Si vous travaillez à domicile comme moi, assurez-vous que vous êtes toujours connecté à votre VPN!

Codage Crétine
la source
-1

J'ai souffert exactement du même problème juste après être passé d'une migration à une autre.

Dans mon cas, j'ai "ciblé la migration" de "migration06" vers "migration04".

J'avais besoin de supprimer le "migration0" 6 puis j'ai pu forcer la création du "migration05". Cela signifie essentiellement que vous devez simplement conserver la prochaine migration après celle ciblée.

Gonzo345
la source
-1

Dans mon cas (en utilisant MS Visual Studio), c'était aussi simple que de redémarrer Visual Studio.

AGuyCalledGerald
la source