Ich verwende EF 6.0 für mein Projekt in C # mit manuellen Migrationen und Updates. Ich habe ungefähr 5 Migrationen in der Datenbank, aber ich habe festgestellt, dass die letzte Migration schlecht war und ich sie nicht will. Ich weiß, dass ich auf eine vorherige Migration zurücksetzen kann, aber wenn ich eine neue (feste) Migration hinzufüge und Update-Database ausführe, wird sogar die fehlerhafte Migration angewendet.
Ich habe versucht, ein Rollback auf die vorherige Migration durchzuführen und die Datei mit einer fehlerhaften Migration zu löschen. Wenn ich dann versuche, eine neue Migration hinzuzufügen, wird beim Aktualisieren der Datenbank eine Fehlermeldung angezeigt, da die Migrationsdatei beschädigt ist (genauer gesagt, die erste Codezeile benennt die Tabelle A in B um und ist die nächste Zeile, mit der EF versucht, die Tabelle zu aktualisieren Name A - vielleicht ist es ein EF-Fehler).
Gibt es eine Abfrage, die ich ausführen kann und die EF so etwas wie "Vergiss die letzte Migration, als ob sie nie existiert hätte, sie war schlecht" mitteilen würde? So etwas wie Remove-Migration.
Edit1
Ich habe eine für mich geeignete Lösung gefunden. Modell in den guten Zustand ändern und ausführen Add-Migration TheBadMigration -Force
. Dadurch wird die letzte, nicht angewendete Migration neu aufgebaut.
Auf jeden Fall beantwortet dies die ursprüngliche Frage immer noch nicht vollständig. Wenn ich die Datenbank auf die fehlerhafte Migration aktualisiere, habe ich keine gute Möglichkeit gefunden, ein Rollback durchzuführen und eine neue Migration zu erstellen, mit Ausnahme der fehlerhaften.
Vielen Dank
quelle
Antworten:
Sie haben 2 Möglichkeiten:
Sie können den Down aus der fehlerhaften Migration entfernen und in eine neue Migration einfügen (Sie müssen auch die nachfolgenden Änderungen am Modell vornehmen). Dies führt effektiv zu einer besseren Version.
Ich verwende diese Option für Dinge, die in mehrere Umgebungen gegangen sind.
Die andere Option besteht darin, tatsächlich
Update-Database –TargetMigration: TheLastGoodMigration
für Ihre bereitgestellte Datenbank zu arbeiten und dann die Migration aus Ihrer Lösung zu löschen. Dies ist eine Art Hulk-Smash-Alternative und erfordert, dass dies für jede Datenbank durchgeführt wird, die mit der fehlerhaften Version bereitgestellt wird.Hinweis: Um die Migration erneut zu erstellen, können Sie sie verwenden
Add-Migration [existingname] -Force
. Dadurch wird jedoch Ihre vorhandene Migration überschrieben. Tun Sie dies daher nur, wenn Sie die vorhandene Migration aus der Datenbank entfernt haben. Dies entspricht dem Löschen der vorhandenen Migrationsdatei und dem Ausführenadd-migration
Ich benutze diese Option während der Entwicklung.
quelle
Wie aus der Frage hervorgeht, gilt dies für eine Migration in einer Entwicklungstypumgebung, die noch nicht freigegeben wurde.
Dieses Problem kann in den folgenden Schritten behoben werden: Stellen Sie Ihre Datenbank auf die letzte gute Migration zurück, löschen Sie die schlechte Migration aus Ihrem Entity Framework-Projekt, generieren Sie eine neue Migration und wenden Sie sie auf die Datenbank an. Hinweis: Nach den Kommentaren zu urteilen, sind diese genauen Befehle möglicherweise nicht mehr anwendbar, wenn Sie EF Core verwenden.
Schritt 1: Wiederherstellen einer vorherigen Migration
Wenn Sie Ihre Migration noch nicht angewendet haben, können Sie diesen Teil überspringen. Um Ihr Datenbankschema auf einen früheren Punkt zurückzusetzen, geben Sie mit dem Befehl Update-Database mit der Option -TargetMigration die letzte gute Migration an. Wenn sich Ihr Entity-Framework-Code in einem anderen Projekt in Ihrer Lösung befindet, müssen Sie möglicherweise die Option '-Project' verwenden oder das Standardprojekt in der Paketmanager-Konsole wechseln.
Um den Namen der letzten guten Migration abzurufen, rufen Sie mit dem Befehl 'Get-Migrations' eine Liste der Migrationsnamen ab, die auf Ihre Datenbank angewendet wurden.
Diese Liste zeigt zuerst die zuletzt angewendeten Migrationen. Wählen Sie die Migration aus, die in der Liste nach der Migration erfolgt, auf die Sie ein Downgrade durchführen möchten, dh die Migration, die vor der Migration angewendet wurde, auf die Sie ein Downgrade durchführen möchten. Stellen Sie nun eine Update-Datenbank aus.
Alle nach der angegebenen Migration angewendeten Migrationen werden herabgestuft, um mit der zuletzt zuerst angewendeten Migration zu beginnen.
Schritt 2: Löschen Sie Ihre Migration aus dem Projekt
Wenn der
remove-migration
Befehl in Ihrer Version von Entity Framework nicht verfügbar ist, löschen Sie die Dateien der unerwünschten Migration Ihres EF-Projektordners "Migrationen" manuell. Zu diesem Zeitpunkt können Sie eine neue Migration erstellen und auf die Datenbank anwenden.Schritt 3: Fügen Sie Ihre neue Migration hinzu
Schritt 4: Wenden Sie Ihre Migration auf die Datenbank an
quelle
add-migration "new migration"
,update-database
Für diejenigen, die EF Core mit ASP.NET Core v1.0.0 verwenden, hatte ich ein ähnliches Problem und verwendete die folgenden Befehle, um es zu beheben (@ DavidSopkos Beitrag wies mich in die richtige Richtung, aber die Details für EF Core unterscheiden sich geringfügig) :
Zum Beispiel wurde in meiner aktuellen Entwicklung der Befehl
Die Remove-Migration entfernt die zuletzt angewendete Migration. Wenn Sie ein komplexeres Szenario mit mehreren zu entfernenden Migrationen haben (ich hatte nur 2, die anfängliche und die schlechte), empfehle ich Ihnen, die Schritte in einem Dummy-Projekt zu testen.
Derzeit scheint es in EF Core (v1.0.0) keinen Befehl zum Abrufen von Migrationen zu geben. Sie müssen daher in Ihrem Migrationsordner nachsehen, was Sie getan haben. Es gibt jedoch einen netten Hilfebefehl:
Beim Aktualisieren der Dastabase im VS2015 SQL Server-Objekt-Explorer wurden alle meine Daten beibehalten und die Migration, die ich zurücksetzen wollte, wurde beendet :)
Anfangs habe ich Remove-Migration selbst ausprobiert und fand den Fehlerbefehl verwirrend:
Es gibt bereits Vorschläge zur Verbesserung dieses Wortlauts, aber ich möchte, dass der Fehler etwa so lautet:
Die Ausgabe des EF Core-Hilfebefehls lautet wie folgt:
quelle
Sie können auch verwenden
Dadurch wird die zuletzt angewendete Migration zurückgesetzt und entfernt
quelle
Aktualisieren Sie zunächst Ihre letzte perfekte Migration über diesen Befehl:
Beispiel:
Löschen Sie dann Ihre nicht verwendete Migration manuell.
quelle
Update-Database 20180906131107_xxxx_xxxx
(kein Bindestrich) hat bei mir funktioniert. Keine Version vonTargetMigration
als Schalter funktionierte. Diese Befehle scheinen ein sich bewegendes Ziel zu sein (dh sie in jeder Version zu ändern)?Ab .NET Core 2.2
TargetMigration
scheint weg zu sein:Das funktioniert jetzt für mich:
Sowie (nein
-Migration
Schalter):Außerdem können Sie Migrationsordner nicht mehr sauber löschen, ohne dass Ihr Modell-Snapshot nicht mehr synchron ist. Wenn Sie dies auf die harte Tour lernen und mit einer leeren Migration enden, bei der Sie wissen, dass Änderungen vorgenommen werden sollten, können Sie diese ausführen (für die letzte Migration sind keine Schalter erforderlich):
Es wird das Chaos beseitigen und Sie dorthin zurückversetzen, wo Sie sein müssen, obwohl der letzte Migrationsordner manuell gelöscht wurde.
quelle
Für EF 6 ist hier ein Einzeiler, wenn Sie viel in der Entwicklung umbauen. Aktualisieren Sie einfach die Vars und verwenden Sie dann weiterhin den Aufwärtspfeil in der Paketmanager-Konsole, um zu spülen und zu wiederholen.
Warum ist das notwendig, fragst du? Sie sind sich nicht sicher, für welche EF6-Versionen dies gilt, aber wenn Ihr neues Migrationsziel bereits angewendet wurde, wird die Verwendung von '-Force' zum erneuten Gerüstbau in Add-Migration das eigentliche Gerüst nicht neu erstellen, sondern eine neue Datei erstellen (dies ist gut was aber, weil du dein 'Down' nicht verlieren willst). Das obige Snippet führt bei Bedarf zuerst das 'Down' durch, dann funktioniert -Force ordnungsgemäß, um das Gerüst wieder aufzubauen.
quelle