559 Stimmen

EF-Migrationen: Rollback der zuletzt durchgeführten Migration?

Das sieht nach einer ganz gewöhnlichen Aufgabe aus, aber ich kann keine einfache Lösung dafür finden.

Ich möchte die zuletzt durchgeführte Migration rückgängig machen. Ich hätte einen einfachen Befehl erwartet, wie

PM> Update-Database -TargetMigration:"-1"

Stattdessen ist alles, was mir einfällt:

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 weglassen...)

Gibt es einen einfacheren Weg?

496voto

Jazimov Punkte 11648

Ich möchte zu diesem Thema eine Klarstellung vornehmen:

Update-Database -TargetMigration:"name_of_migration"

Was Sie oben tun, bedeutet, dass Sie alle Migrationen zurücksetzen wollen, bis Sie nur noch die angegebene Migration haben. Wenn Sie also GET-MIGRATIONS verwenden und feststellen, dass Sie A, B, C, D und E haben, dann werden Sie mit diesem Befehl E und D zurücksetzen, um zu C zu gelangen:

Update-Database -TargetMigration:"C"

Außerdem ist mir aufgefallen, dass Sie einen Ordinalwert und den kurzen Schalter -Target verwenden können (also ist -Target dasselbe wie -TargetMigration), es sei denn, jemand kann das Gegenteil behaupten. Wenn Sie alle Migrationen rückgängig machen und von vorne beginnen möchten, können Sie dies tun:

Update-Database -Target:0

0, oben, würde sogar die ERSTE Migration rückgängig machen ( Dies ist ein destruktiver Befehl - seien 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, die den Namen der Zielmigration erfordert (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 die Migrationen A, B, C, D und E (in dieser Reihenfolge) angewendet haben, sollte sich die Ordnungszahl 1 auf A beziehen, die Ordnungszahl 2 auf B usw. Für ein Rollback zu B könnten Sie also entweder:

Update-Database -TargetMigration:"B"

o

Update-Database -TargetMigration:2

Oktober 2019 bearbeiten:

Nach diesem Zusammenhang Antwort bei einer ähnlichen Frage lautet der richtige Befehl -Target für EF Core 1.1, während es sich -Migration für EF Core 2.0.

259voto

Andrew Peters Punkte 10867

Ab EF 5.0 ist der von Ihnen beschriebene Ansatz der bevorzugte Weg. Also

PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"

oder anhand Ihrer Beispielmigrationen

PM> Update-Database -TargetMigration:"CategoryIdIsLong"

Eine Lösung wäre, ein Wrapper-PS-Skript zu erstellen, das die oben genannten Schritte automatisiert. Darüber hinaus können Sie gerne eine Anfrage für diese Funktion erstellen, oder noch besser, versuchen Sie es selbst zu implementieren! https://github.com/dotnet/ef6

143voto

MaciejLisCK Punkte 3366

En EntityFrameworkCore :

Update-Database 20161012160749_AddedOrderToCourse

wobei 20161012160749_AddedOrderToCourse ist der Name der Migration, zu der Sie zurückkehren möchten.

62voto

QmlnR2F5 Punkte 832

Ich habe festgestellt, dass es keine guten Lösungen gibt, die das CLI verwenden dotnet Befehl, also hier ist einer:

dotnet ef migrations list
dotnet ef database update NameOfYourMigration

An der Stelle von NameOfYourMigration geben Sie den Namen der Migration ein, zu der Sie zurückkehren möchten.

Dann können Sie alle rückgängig gemachten Migrationen endgültig entfernen, indem Sie

dotnet ef migrations remove

17voto

Max Punkte 538

Die Lösung ist:

Update-Database –TargetMigration 201609261919239_yourLastMigrationSucess

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X