Es kann keine explizite Migration im Entity Framework generiert werden

96

Ich füge eine neue Migration hinzu, aber diese Meldung zeigt:

Eine explizite Migration kann nicht generiert werden, da die folgenden expliziten Migrationen ausstehen: [201203170856167_left]. Wenden Sie die ausstehenden expliziten Migrationen an, bevor Sie versuchen, eine neue explizite Migration zu generieren.

Kann mir jemand helfen?

Noman Saeed
quelle
11
Dies passierte mir, als ich versehentlich mein Startprojekt auf ein anderes umgestellt hatte. Möglicherweise möchten Sie (oder andere, die dies lesen) dies schnell überprüfen, bevor Sie eine eingehendere Fehlerbehebung versuchen (insbesondere solche, bei denen Sie mit dem Löschen von Migrationen usw. beginnen müssen).
NicholasFolk
Im Migrationsverzeichnis befindet sich eine Migrationsklasse, die in der _MigrationHistory der Datenbank nicht aktualisiert wird. Das Entfernen dieser Klasse, um sowohl im Migrationsverzeichnis als auch in der Datenbank denselben Status zu haben, hat mein Problem behoben.
Aryan Firouzian
1
Das passiert mir zufällig. Wenn es passiert, zeigt es, dass alle meine Migrationen angewendet werden müssen. Ich muss Visual Studio neu starten, damit es funktioniert, da ich bereits alles richtig eingerichtet habe.
Larry Flewwelling

Antworten:

81

Es zeigt Ihnen, dass Ihre Anwendung eine unverarbeitete Migration enthält und ausgeführt werden muss, Update-Databasebevor Sie eine weitere Migration hinzufügen können.

Ladislav Mrnka
quelle
12
Was ich möchte Sie eine erste Migration neu erstellen? Das hindert Sie daran?
Rebecca
Hat bei mir nicht funktioniert, Update-Database hat mir nur einen weiteren Fehler gegeben. Ich musste zuerst die ausstehenden Dateien löschen.
Vahx
1
Die Antwort von Thomas war die nützliche für meinen ähnlichen Fall.
Tarek Shawadfy
2
Es kann notwendig sein, ein Startup-Projekt zu deklarieren-StartupProject ContentHub.Database
Osanger
2
Update-Databasegibt> Datenbank kann nicht aktualisiert werden, um mit dem aktuellen Modell
übereinzustimmen,
53

Ich hatte das gleiche Problem. Anscheinend generiert das Entity Framework diesen Fehler, wenn keine Verbindung zur Datenbank hergestellt werden kann. Stellen Sie also sicher, dass Sie darauf zugreifen können, bevor Sie nach anderen Problemen suchen.

Robin Dorbell
quelle
1
Ich möchte auch hinzufügen, dass dies der Fall ist, wenn Sie Ihre App.config in ein anderes Projekt verschieben oder wenn sie in Ihrem Projekt einfach fehlt oder wenn sie sich in Ihrem Projekt befindet, aber falsch konfiguriert ist.
Code Maverick
Ich habe den gleichen Fehler erhalten, nachdem sich meine IP geändert hat (sowohl nach dem Standortwechsel als auch nach einem Dyn-DNS-Wechsel). Dies verursachte die Firewall in der Azure-Datenbank, mit der wir die Anmeldung widerrufen. Nicht hilfreiche EF-Migrationen geben den obigen Fehler anstelle von "konnte sich nicht anmelden" ...
Victor
8
Ein weiterer Punkt, den ich ansprechen möchte, ist sicherzustellen, dass Ihr Startprojekt mit der Verbindungszeichenfolge Ihres Datenbankkontexts übereinstimmt. Ich hatte dieses Problem, als ich mein Startprojekt vorübergehend änderte und nicht feststellte, dass das andere Projekt nicht dieselbe Verbindungszeichenfolge hatte.
Gage Trader
Hinzufügen zu @GageTrader: Ich hatte mehrere Startprojekte, eines ohne Konfiguration und ein Webprojekt mit EF-Konfiguration. Das (Repository-) Projekt mit Migrationen hat in seiner app.config dieselbe EF-Konfiguration wie das Webprojekt. Aber selbst wenn ich das Repository-Projekt als Startprojekt ausgewählt habe, hat es nicht funktioniert, aber als ich das Webprojekt auf Start gesetzt habe, hat es funktioniert.
JimiSweden
Ich musste explizit den Parameter -ConnectionString angeben, der den Trick für mich erledigte
Brian Colavito
34

Sie müssen entweder "update-database" über die Paketmanagerkonsole ausführen, um Ihre Änderungen in die Datenbank zu übertragen, oder Sie können die ausstehende Migrationsdatei ([201203170856167_left]) aus Ihrem Migrationsordner löschen und dann "add-migration" erneut ausführen Erstellen Sie eine brandneue Migration basierend auf Ihren Änderungen.

Socketman
quelle
Ich habe die Migrationsdatei gelöscht und die Add-Migration ausgeführt, aber es wird immer noch der gleiche Fehler ausgegeben.
Nu Everest
2
Vielen Dank, der Tipp zum Löschen der ausstehenden Migrationsdatei war ein Lebensretter
Manish
30

Dieser Fehler kann auch dazu führen, dass die Migrationen nicht mehr erkannt werden. Dies ist mir passiert, nachdem ich den Wert des ContextKey in Migrations.Configuration geändert habe. Die Lösung bestand einfach darin, den ContextKey in der Datenbanktabelle "__MigrationHistory" zu aktualisieren (oder den Wert in der Konfigurationsklasse zurückzusetzen, denke ich). Der ContextKey und der Namespace in Ihrer Anwendung sollten übereinstimmen.

Thomas
quelle
1
Das war die richtige Antwort für meinen Fall. Da ich eines meiner alten Projekte für ein neues ähnliches Projekt verwendet habe, konnte ich über die alten Migrationen keine Änderungen an der Datenbank vornehmen. Wie Thomas vorschlug, unterschied sich der Namespace in den Migrationen vom Kontextschlüssel in der Tabelle _MigrationsHistory, wodurch alte Migrationen nicht erkannt wurden.
Tarek Shawadfy
Dies hat mir geholfen, da ich das Problem durch Umbenennen der Lösung verursacht habe. Dabei hatte ich den ContextKey umbenannt, sodass er nicht mehr mit den _MigrationHistory-Einträgen übereinstimmte.
Joel
Hat auch für mich funktioniert, einen expliziten Kontextschlüssel in der Konfiguration festgelegt, ihn in der __MigrationHistory geändert und die Update-Datenbank hat entschieden, dass alles cool ist. Vielen Dank!
James White
2
Lächerlich, aber es ist richtig. Wenn Sie den Projektnamen aktualisiert haben oder wenn Sie Ihr Projekt (meinen Fall) in wenige aufgeteilt haben und versuchen, eine neue Migration von einem neuen Projekt zu derselben Datenbank hinzuzufügen, müssen Sie den richtigen ContextKey verwenden. Sie können ihn im Konfigurationskonstruktor festlegen ( Sie müssen den Kontextschlüssel verwenden, den Sie in der Tabelle __MigrationHistory in der Ziel-DB haben)
BotanMan
Ebenso habe ich meinen Standard-Namensraum umbenannt und ihn in meiner gesamten Lösung ersetzt, die dieses Problem verursacht hat
WtFudgE
18

1. Verbindungszeichenfolge / Verbindungsberechtigungen

Überprüfen Sie die Verbindungszeichenfolge erneut.

Stellen Sie sicher, dass der Benutzer, mit dem Sie eine Verbindung herstellen, weiterhin über die Berechtigung zum Lesen [__MigrationHistory]und zum Bearbeiten des Schemas verfügt.

Sie können auch versuchen, die Verbindungszeichenfolge in der App- oder Webkonfigurationsdatei so zu ändern, dass Integrated Security (Windows Auth) verwendet wird, um den Befehl add-migration als Sie selbst auszuführen .

Beispielsweise:

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

Diese Verbindungszeichenfolge wird in die Datei App.config des Projekts aufgenommen, in dem sich der DbContext befindet.

2. StartUp-Projekt

Sie können die StartUp - Projekt auf der Befehlszeile angeben , oder Sie können das Projekt mit der rechten Maustaste DbContext, Configurationund Migrations - Ordner und wählen Sie Als Startprojekt festlegen . Ich meine es ernst, das kann tatsächlich helfen.

Geben Sie hier die Bildbeschreibung ein

Jess
quelle
Haha. Ich wünschte, dies würde mehr Stimmen bekommen. Das passiert mir sehr oft und das Integrated SecurityUpdate funktioniert super!
Jess
1
Ich hatte das gleiche Problem, keiner der Migrationsbefehle funktionierte. Es stellte sich heraus, dass das Nichteinstellen des Startprojekts der Schuldige war. Das Einstellen dieses Problems hat mein Problem behoben.
Vishal
Das Ändern des Startprojekts hat bei mir funktioniert! Ich war mir sicher, dass es nicht funktionieren würde, aber ich habe es trotzdem versucht, da alles andere fehlgeschlagen ist. Gute Antwort.
Sylvain Rodrigue
"Als Startup festlegen" - hätte nie gedacht! Danke dir!!
Jasel
1
Ja, ich habe das Startprojekt absichtlich geändert und vergessen, es wieder zu ändern. Und lustig ist, dass eine Migration zuvor mit einem geeigneten Startprojekt durchgeführt wurde, sodass alles gut funktioniert hat. Aber das ist jetzt logisch - b / c EF nimmt Verbindungszeichenfolge aus dem Projekt, daher "weiß es nicht", dass Migrationen tatsächlich bereits auf DB angewendet wurden ...
kosist
8

Hatte das gleiche Problem und konnte mit einigen Hinweisen aus den obigen Antworten lösen:

  • Überprüfen Sie in der Paketmanagerkonsole das Standardprojekt (zeigen Sie auf das Projekt mit der Migrationskonfiguration
  • Stellen Sie sicher, dass das Startprojekt über eine web.config mit einem gültigen Verbindungsstring verfügt (oder
  • Stellen Sie sicher, dass das Projekt mit Migrationen über eine app.config / web.config mit einer gültigen Verbindungszeichenfolge verfügt
  • Überprüfen Sie die Berechtigungen in der Datenbank (für den in Ihrem Verbindungsstring konfigurierten Benutzer).

Verwenden Sie "update-database -verbose" in der Paketmanagerkonsole, um genauere Informationen zu erhalten, zu denen Migrationen eine Verbindung herstellen möchten. (Hat in meinem Fall geholfen herauszufinden, dass mein Startprojekt nicht richtig eingestellt war ...)

biegen
quelle
2
lief "update-database -verbose" und bemerkte, dass meine Verbindungszeichenfolge unterbrochen war, lol. Der Befehl add-migration gibt also die falsche Meldung aus.
Wachburn
4
"Stellen Sie sicher, dass das Startprojekt {...}" mein Problem gelöst hat. Danke @flex
Andy Schmitt
7

Wenn Sie auf dieses Problem stoßen, versuchen Sie bitte, Ihrem Cmdlet "Add-Migration" Parameter hinzuzufügen. Wenn Sie beispielsweise das Startprojekt sowie den Namen der Verbindungszeichenfolge angeben, kann EF Ihre Zieldatenbank leichter finden.

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

Wo:

Delta_Defect_0973 ist der Name Ihrer Migration

your.namespace.ContextClassName ist der Name Ihrer Konfigurationsklasse in Ihrem Migrationsordner, dem der vollständige Namensraum vorangestellt ist.

DeltaProject ist der Name Ihres Hauptprojekts mit Ihrer Datei web.config oder app.config.

DeltaSQL ist der Name Ihrer Verbindungszeichenfolge, die in Ihrer Datei web.config oder app.config definiert ist.

Yves Rochon
quelle
Vielen Dank. Das hat mir wirklich geholfen.
Jess
Wenn Sie in Ihrer Lösung die Abhängigkeitsinjektion verwenden, müssen Sie möglicherweise ein anderes Standardprojekt in der Package Manager-Konsole auswählen. Wenn EF Ihre Migrationen nicht finden kann, wählen Sie das Projekt aus, das die Migrationen tatsächlich als Standardprojekt enthält.
Yves Rochon
5

Dieser Fehler bedeutet, dass ausstehende Migrationen festgeschrieben werden müssen, bevor Sie eine weitere explizite Migration ausführen können. Sie können wählen

  1. Führen Sie diese ausstehenden Migrationen mit dem Befehl Update-Database aus
  2. Löschen Sie diese ausstehenden Migrationen. Am sichersten ist es, den Ordner "Migrationen" zu öffnen. Klicken Sie mit der rechten Maustaste auf [201203170856167_left]> Vom Projekt ausschließen

Danach können Sie "Add-Migration ..." erneut starten

Ich hoffe es hilft

Hung Vu
quelle
4

Nur meine zwei Cent:

Mein Szenario:

  1. Ich habe meine lokale Datenbank in einen funktionsfähigen Zustand versetzt.
  2. Es wurden bereits Migrationen darauf angewendet.
  3. Wann immer ich versuchte, eine neue Migration hinzuzufügen, wurde der Fehler bezüglich ausstehender Migrationen angezeigt, wie im OP erwähnt.

Lösung:

Um dies zu umgehen, habe ich nur explizitere Parameter angegeben:

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

Ich bin der Überzeugung, dass Sie in Ihrem Ordner app.config eine Einstellung festlegen können, mit der Sie dieses Verhalten als Standard festlegen können, sodass Sie nicht jedes Mal explizite Parameter angeben müssen. Ich bin mir jedoch nicht sicher, wie ich das machen soll.

IbrarMumtaz
quelle
1
Dies hat bei mir funktioniert. Ich habe gerade den Namen der Migration am Ende des oben gezeigten Befehls hinzugefügt.
Sfors sagt, Monica
1
=) - froh, dass ich helfen konnte.
IbrarMumtaz
1
-ConnectionStringNameist eine Alternative dazu und zieht die Verbindungszeichenfolge aus Ihrer Konfiguration nach Namen
Simon_Weaver
1
Dies hat mir geholfen, weil ich die Verbindungszeichenfolge nicht in der Konfigurationsdatei speichere
Sasinosoft
3

Es gibt eine Mehrdeutigkeit und damit einen Fehler. Am besten schließen Sie die aktuelle Migrationsdatei aus und erstellen eine neue Migrationsdatei ( Add-Migration ). Kopieren Sie dann den Inhalt der neuen Migration in die ausgeschlossene Datei, fügen Sie ihn erneut ein und führen Sie den Befehl update-database aus .

Sachin Cholkar
quelle
Ich habe gerade den update-databaseBefehl ausgeführt und dann meinen add-migrationBefehl wiederholt und es hat funktioniert
Smitty-Werben-Jager-Manjenson
3

Ich habe das gleiche Problem wie folgt gelöst:

  • alte Migrationsdatei löschen
  • Update-Datenbank-Force
  • Add-Migration AddedEntity
  • Datenbank auf den neusten Stand bringen
Yilmazdincsoy
quelle
1

Ich hatte die gleichen Probleme und konnte sie nur mit Add-Migration 'MigrationName' -Force beheben

Mit -Force ist der wichtige Teil.

Evan Barke
quelle
1

In meiner lokalen Datenbank war die nicht __MigrationHistoryausgefüllt oder vorhanden. Ich habe die Tabelle manuell erstellt und dann die Daten in dieser Tabelle von PROD in meine lokale Datenbank migriert. Dies führte dazu, dass VS glaubte, die Migrationen seien angewendet worden (was sie waren).

Kontaktmatt
quelle
Ich hatte das gleiche Problem, ich habe meine Live-Datenbank in die Produktion zusammengeführt, aber daher ging der Migrationsverlauf verloren.
matthy
1

Tipp:-Script Wenn Sie sich nicht sicher sind, können Sie den Schalter immer für Migrationsbefehle verwenden. Es hilft auch wirklich zu verstehen, was Update-Databasetatsächlich tut.

Ich führe Folgendes aus, um die Datenbank zu aktualisieren, und erhalte dann ein Skript, das ich manuell anwenden kann (oder es einfach ohne das -Script-Tag erneut ausführen kann).

Denn Update-Databaseich würde folgendes ausführen:

Update-Database -Script -ConfigurationTypeName Configuration_ASPNETIdentity -ConnectionStringName SQL_AzureLive

Wo SQL_AzureLiveist die benannte Verbindungszeichenfolge in meiner Konfiguration?

Dann kann ich überprüfen, ob SQL richtig aussieht, es anwenden und fertig sein. Wie viele andere gesagt haben, wird diese Fehlermeldung angezeigt, wenn die Verbindungszeichenfolge falsch oder ungültig ist.

Simon_Weaver
quelle
1

Für mich habe ich die Migrationsdatei (in Ihrem Fall "201203170856167_left") aus dem MigrationsOrdner gelöscht und dann den folgenden Befehl in der Package Manager-Konsole ausgeführt

Add-Migration <Parameter>
Update-Database
Surendra Mourya
quelle
0

Szenario

  • Ich arbeite in einem Zweig, in dem ich eine neue DB-Migration erstellt habe.
  • Ich bin bereit, vom Master zu aktualisieren, aber der Master hat auch eine kürzlich durchgeführte DB-Migration.
  • Ich lösche die Datenbankmigration meines Zweigs, um Konflikte zu vermeiden.
  • Ich "Update vom Master".

Problem

Nach dem Update vom Master führe ich "Add-Migration my_migration_name" aus, erhalte aber den folgenden Fehler:

Eine explizite Migration kann nicht generiert werden, da die folgenden expliziten Migrationen ausstehen: [201607181944091_AddExternalEmailActivity]. Wenden Sie die ausstehenden expliziten Migrationen an, bevor Sie versuchen, eine neue explizite Migration zu generieren.

Also starte ich "Update-Database" und erhalte folgenden Fehler:

Die Datenbank kann nicht aktualisiert werden, um mit dem aktuellen Modell übereinzustimmen, da Änderungen ausstehen und die automatische Migration deaktiviert ist

Lösung

Zu diesem Zeitpunkt löste das erneute Ausführen von "Add-Migration my_migration_name" mein Problem. Meine Theorie ist, dass das Ausführen von "Update-Database" alles in dem Zustand hat, in dem es sein muss, damit "Add-Migration" funktioniert.

Tod Birdsall
quelle
0

Ich bin auch auf dieses Problem gestoßen. Es kam, als ich eine neue Datenbank erstellte und ausstehende Änderungen für meine Code-First-DB-Migration hatten. Dann habe ich versucht, den Befehl "Update-Database" auszuführen. Lösung: Führen Sie den Befehl "Add-Migration -MigrationName" aus, um eine neue Migration für eine neue Datenbank zu erstellen. Führen Sie dann den Befehl "Update-Database" aus.

Pritam
quelle
0

Ich hatte dieses Problem auch für eine Datenbank, von der ich wusste, dass sie beim Ausführen von Add-Migration auf dem neuesten Stand war. Gelöst durch einfaches zweites Ausführen des Befehls Add-Migration. Verdacht auf ein Konnektivitätsproblem, wie oben von Robin Dorbell vorgeschlagen.

spadelives
quelle
In meinem Szenario Der Datenbankname hat bei der Ausführung des Befehls zwischen Groß- und Kleinschreibung unterschieden. Sobald der Verbindungsstring genau so war wie in DB, funktionierte er
einwandfrei
0

Das geschah, als ich plötzlich die Klasse der alten Migration umbenannte, die bereits in db existiert. Ich habe den VCS-Verlauf überprüft, festgestellt und wieder umbenannt. Alle arbeiteten danach.

Doktor Coder
quelle
0

Ich habe es anders gemacht. Ich habe die Datenbank komplett gelöscht und "update-database" erneut in vs.

Ghadir Farzaneh
quelle
Dies bietet keine praktikable Lösung. Eine gültige Migration behält die vorhandene Struktur bei.
Ferdipux
0

Ich hatte ein einfacheres Problem. VS hat diesen Fehler fälschlicherweise gemeldet, als ich eine VPN-Verbindung zu einem Clientstandort hatte, der auf meiner Workstation verbunden war. Das Problem war, dass die DBMS-Sicherheit so eingestellt war, dass Anforderungen nur von meiner realen lokalen IP akzeptiert wurden. Durch einfaches Ausschalten des VPN wurde das Problem behoben.

spadelives
quelle
0

In meinem Fall habe ich vergessen, meine IP-Adresse in Azure in Firewall-Regeln einzufügen. Da ich keine Verbindung zur Datenbank herstellen konnte, wurde dieser Fehler angezeigt. Speziell für meinen Fall habe ich meine IP-Adresse in die Regeln der Datenbank-Firewall in Azure eingefügt, und alles hat gut funktioniert. Abgesehen davon kann es sich um ein Problem mit Proxy / Internetverbindung / DB-Benutzername, Kennwort / DB-Verbindungszeichenfolge usw. handeln. ODER es können offensichtlich ausstehende Migrationen vorliegen, für die Sie den Befehl Update-Database ausführen müssen.

Siddharth Sachdeva
quelle
0

In der Vergangenheit habe ich dies immer gelöst, indem ich die ausstehenden Migrationen gelöscht habe oder wenn nur noch 1 übrig war und es meistens wünschenswert war, sie -fneu zu erstellen.

Vor kurzem hat dies für mich aufgehört zu arbeiten.

Als dies das erste Mal geschah, habe ich Visual Studio neu gestartet und dann konnte ich fortfahren.

Das zweite Mal hat es erst funktioniert, nachdem ich ein Clean für das Projekt ausgeführt habe. Es war fast so, als würden die ausstehenden Migrationen beibehalten, obwohl alle Dateien aus dem Explorer gelöscht wurden.

Adam Marshall
quelle
0

Dies wird für viele Menschen nicht die Antwort sein, aber EF wird diesen Fehler beheben, wenn keine Verbindung zur Datenbank hergestellt werden kann. Wenn Sie wie ich von zu Hause aus arbeiten, stellen Sie sicher, dass Sie immer noch mit Ihrem VPN verbunden sind!

CodingCretin
quelle
-1

Ich hatte genau das gleiche Problem, kurz nachdem ich von einer Migration zu einer anderen zurückgekehrt war.

In meinem Fall habe ich "gezielte Migration" von "Migration06" nach "Migration04".

Ich musste die "Migration0" 6 löschen und konnte dann die Erstellung der "Migration05" erzwingen. Dies bedeutet im Grunde, dass Sie nur die nächste Migration nach der Zielmigration beibehalten müssen.

Gonzo345
quelle
-1

In meinem Fall (mit MS Visual Studio) war es so einfach wie ein Neustart von Visual Studio.

AGuyCalledGerald
quelle