Das sieht nach einer wirklich häufigen Aufgabe aus, aber ich kann keinen einfachen Weg finden, dies zu tun.
Ich möchte die zuletzt angewendete Migration rückgängig machen. Ich hätte einen einfachen Befehl erwartet, wie
PM> Update-Database -TargetMigration:"-1"
Stattdessen kann ich mir nur Folgendes einfallen lassen:
PM> Get-Migrations
Retrieving migrations that have been applied to the target database.
201208012131302_Add-SystemCategory
201207311827468_CategoryIdIsLong
201207232247409_AutomaticMigration
201207211340509_AutomaticMigration
201207200025294_InitialCreate
PM> Update-Database -TargetMigration:"CategoryIdIsLong"
(Zumindest kann ich nur den Namen verwenden und den Zeitstempel überspringen ...)
Gibt es einen einfacheren Weg?
entity-framework
entity-framework-4
database-migration
ef-migrations
Cristian Diaconescu
quelle
quelle
Antworten:
Ab EF 5.0 ist der von Ihnen beschriebene Ansatz der bevorzugte Weg. Damit
PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"
oder verwenden Sie Ihre Beispielmigrationen
PM> Update-Database -TargetMigration:"CategoryIdIsLong"
Eine Lösung wäre, ein Wrapper-PS-Skript zu erstellen, das die obigen Schritte automatisiert. Sie können auch eine Feature-Anfrage dafür erstellen oder noch besser versuchen, diese zu implementieren! https://github.com/dotnet/ef6
quelle
dotnet ef database update LastGoodMigration
dies scheint jedoch verwirrend zu sein, da ich von einem Knotenhintergrund komme und knex, sequlize verwende. Sie haben einen Befehl, um die letzte Änderung rückgängig zu machen. Gibt es einen Befehl, um die letzte Aktion zurückzusetzen, die auf die Datenbank angewendet wurde? ?Ich möchte diesem Thread einige Erläuterungen hinzufügen:
Was Sie oben tun, ist zu sagen, dass Sie alle Migrationen zurücksetzen möchten, BIS Sie mit der angegebenen Migration belassen haben. Wenn Sie also GET-MIGRATIONS verwenden und feststellen, dass Sie A, B, C, D und E haben, werden mit diesem Befehl E und D zurückgesetzt, um zu C zu gelangen:
Außerdem habe ich festgestellt, dass Sie einen Ordnungswert und den kurzen Schalter -Target verwenden können, es sei denn, jemand kann etwas anderes kommentieren (daher ist -Target dasselbe wie -TargetMigration). Wenn Sie alle Migrationen zurücksetzen und neu beginnen möchten, können Sie Folgendes verwenden:
0 oben würde sogar die ERSTE Migration rückgängig machen ( dies ist ein destruktiver Befehl - stellen Sie sicher, dass Sie wissen, was Sie tun, bevor Sie ihn verwenden! ) - etwas, das Sie nicht tun können, wenn Sie die obige Syntax verwenden, für die der Name erforderlich ist die Zielmigration (der Name der 0. Migration existiert nicht, bevor eine Migration angewendet wird!). In diesem Fall müssen Sie also den Wert 0 (Ordnungszahl) verwenden. Wenn Sie Migrationen A, B, C, D und E (in dieser Reihenfolge) angewendet haben, sollte sich die Ordnungszahl 1 auf A beziehen, Ordnungszahl 2 auf B usw. Zum Zurücksetzen auf B können Sie entweder Folgendes verwenden:
oder
Bearbeiten Oktober 2019:
Gemäß dieser verwandten Antwort auf eine ähnliche Frage gilt der richtige Befehl
-Target
für EF Core 1.1, während er-Migration
für EF Core 2.0 gilt.quelle
$InitialDatabase
.ls variable:*
Es sieht so aus, als wäre$InitialDatabase
es einfach eine PowerShell-Variable, die als 0 definiert ist. Es sind keine anderen definiert, selbst im aktuellen EF-Quellcode. Und get-migrations gibt nichts zurück, sondern schreibt nur in die Konsole, sodass Sie nicht über die zurückgegebenen Objekte iterieren können ...In EntityFrameworkCore :
Wo
20161012160749_AddedOrderToCourse
ist ein Name für die Migration, zu der Sie ein Rollback durchführen möchten?quelle
Die Lösung ist:
quelle
Zusätzliche Erinnerung:
Wenn Sie mehrere Konfigurationstypen haben, müssen Sie den [Konfigurationsnamen] angeben.
quelle
In EF Core können Sie den Befehl
Remove-Migration
in der Paketmanagerkonsole eingeben, nachdem Sie Ihre fehlerhafte Migration hinzugefügt haben.Die Konsole schlägt vor, dies zu tun, wenn bei Ihrer Migration Daten verloren gehen könnten:
quelle
Warnung : Dadurch werden ALLE Migrationen in EFCore zurückgesetzt! Bitte vorsichtig verwenden :)
quelle
Ich habe festgestellt, dass dies funktioniert, wenn es in der Package Manager-Konsole ausgeführt wird:
dotnet ef migrations list | select -Last 2 | select -First 1 | ForEach-Object { Update-Database -Migration $_ }
Sie können ein Skript erstellen, das es einfacher macht.
quelle
Ich verwende EntityFrameworkCore und verwende die Antwort von @MaciejLisCK. Wenn Sie mehrere DB-Kontexte haben, müssen Sie den Kontext auch angeben, indem Sie den Kontextparameter hinzufügen, z.
Update-Database 201207211340509_MyMigration -context myDBcontext
(Wo
201207211340509_MyMigration
ist die Migration, auf die Sie zurücksetzen möchten, undmyDBcontext
der Name Ihres DB-Kontexts)quelle
Für dieses Problem schlage ich diesen Link vor:
https://elegantcode.com/2012/04/12/entity-framework-migrations-tips/
quelle
Falls die Möglichkeit besteht, dass Datenverlust EF den Befehl update-database nicht ausführt, da AutomaticMigrationDataLossAllowed = false standardmäßig ist, und die Aktion zurücksetzt, es sei denn, Sie führen sie mit dem Parameter -force aus .
oder
quelle