To wygląda na bardzo częste zadanie, ale nie mogę znaleźć łatwego sposobu na wykonanie tego.
Chcę cofnąć ostatnią zastosowaną migrację. Spodziewałbym się prostego polecenia, na przykład
PM> Update-Database -TargetMigration:"-1"
Zamiast tego mogę tylko wymyślić:
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"
(Przynajmniej mogę użyć tylko nazwy, pomijając znacznik czasu ...)
Czy istnieje prostszy sposób?
entity-framework
entity-framework-4
database-migration
ef-migrations
Cristian Diaconescu
źródło
źródło
Odpowiedzi:
Od wersji 5.0 5.0 podejście, które opisujesz, jest preferowanym sposobem. Więc
PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"
lub korzystając z przykładowych migracji
PM> Update-Database -TargetMigration:"CategoryIdIsLong"
Jednym z rozwiązań byłoby utworzenie otoki PS skryptu, który automatyzuje powyższe kroki. Ponadto możesz utworzyć prośbę o tę funkcję lub jeszcze lepiej, wypróbuj ją! https://github.com/dotnet/ef6
źródło
dotnet ef database update LastGoodMigration
jednak wydaje się to mylące, ponieważ wychodzę z tła węzła i za pomocą knex, sequlize, mają polecenie cofnięcia ostatniej zmiany, czy istnieje polecenie cofnięcia ostatniej akcji, która została zastosowana do bazy danych ?Chcę dodać wyjaśnienie do tego wątku:
To, co robisz powyżej, mówi, że chcesz wycofać wszystkie migracje, dopóki nie pozostaniesz z określoną migracją. Zatem jeśli użyjesz GET-MIGRATIONS i okaże się, że masz A, B, C, D i E, to użycie tego polecenia spowoduje cofnięcie E i D, aby dostać się do C:
Ponadto, chyba że ktokolwiek może skomentować inaczej, zauważyłem, że można użyć wartości porządkowej i krótkiego przełącznika -Target (a zatem -Target jest taki sam jak -TargetMigration). Jeśli chcesz wycofać wszystkie migracje i zacząć od nowa, możesz użyć:
0 powyżej cofnęłoby nawet PIERWSZĄ migrację ( jest to destrukcyjne polecenie - upewnij się, że wiesz, co robisz przed użyciem! ) - coś, czego nie możesz zrobić, jeśli użyjesz powyższej składni, która wymaga nazwy migracja docelowa (nazwa 0 migracji nie istnieje przed zastosowaniem migracji!). W takim przypadku musisz użyć wartości 0 (porządkowej). Podobnie, jeśli zastosowałeś migracje A, B, C, D i E (w tej kolejności), wówczas porządek 1 powinien odnosić się do A, porządek 2 powinien odnosić się do B i tak dalej. Aby przywrócić B, możesz użyć:
lub
Edytuj październik 2019:
Zgodnie z tą pokrewną odpowiedzią na podobne pytanie, poprawne polecenie dotyczy
-Target
EF Core 1.1, podczas gdy dotyczy to-Migration
EF Core 2.0.źródło
$InitialDatabase
.ls variable:*
tego wygląda$InitialDatabase
to po prostu zmienna PowerShell zdefiniowana jako 0, nie ma żadnych innych zdefiniowanych, nawet w bieżącym kodzie źródłowym EF. A migracje get nic nie zwracają, tylko zapisują na konsoli, więc nie można iterować po zwróconych obiektach ...W EntityFrameworkCore :
gdzie
20161012160749_AddedOrderToCourse
jest nazwa migracji, do której chcesz przywrócić.źródło
Rozwiązaniem jest:
źródło
Dodatkowe przypomnienie:
Jeśli masz wiele typów konfiguracji, musisz podać [ConfigurationName]
źródło
W EF Core możesz wpisać polecenie
Remove-Migration
w konsoli menedżera pakietów po dodaniu błędnej migracji.Konsola sugeruje, aby to zrobić, jeśli migracja może wiązać się z utratą danych:
źródło
Ostrzeżenie : spowoduje to wycofanie WSZYSTKICH migracji w EFCore! Proszę używać ostrożnie :)
źródło
Stwierdziłem, że działa to po uruchomieniu w konsoli Menedżera pakietów:
dotnet ef migrations list | select -Last 2 | select -First 1 | ForEach-Object { Update-Database -Migration $_ }
Możesz stworzyć skrypt, który to ułatwi.
źródło
Korzystam z EntityFrameworkCore i korzystam z odpowiedzi @MaciejLisCK. Jeśli masz wiele kontekstów DB, musisz także określić kontekst, dodając parametr kontekstu, np .:
Update-Database 201207211340509_MyMigration -context myDBcontext
(gdzie
201207211340509_MyMigration
jest migracja, do której chcesz przywrócić imyDBcontext
nazwa twojego kontekstu DB)źródło
W przypadku tego problemu sugeruję ten link:
https://elegantcode.com/2012/04/12/entity-framework-migrations-tips/
źródło
W przypadku, gdy istnieje możliwość, że utrata danych EF nie wykona polecenia update-database, ponieważ AutomaticMigrationDataLossAllowed = false domyślnie, i wycofuje akcję, chyba że uruchomisz ją z parametrem -force .
lub
źródło