Używam EF 6,0 do mojego projektu w C # z ręcznymi migracjami i aktualizacjami. Mam w bazie około 5 migracji, ale zdałem sobie sprawę, że ostatnia migracja była zła i nie chcę jej. Wiem, że mogę wrócić do poprzedniej migracji, ale kiedy dodam nową (naprawioną) migrację i uruchomię Update-Database, stosowana jest nawet błędna migracja.
Próbowałem wrócić do poprzedniej migracji i usunąć plik z błędną migracją. Ale potem, kiedy próbuję dodać nową migrację, pojawia się błąd podczas aktualizacji bazy danych, ponieważ plik migracji jest uszkodzony (dokładniej, pierwsza linia kodu zmienia nazwę tabeli A na B i jest następna, EF próbuje zaktualizować tabelę za pomocą nazwa A - może to jakiś błąd EF).
Czy jest jakieś zapytanie, które mogę uruchomić, które powie EF coś w stylu „Zapomnij o ostatniej migracji, jakby nigdy nie istniała, była zła”? Coś w rodzaju Remove-Migration.
Edit1
Znalazłem rozwiązanie odpowiednie dla mnie. Zmiana modelu na dobry stan i uruchomienie Add-Migration TheBadMigration -Force
. Spowoduje to ponowne utworzenie szkieletu ostatniej, niezastosowanej migracji.
W każdym razie to wciąż nie daje pełnej odpowiedzi na pierwotne pytanie. Jeśli zaktualizuję bazę danych do złej migracji, nie znalazłem dobrego sposobu na przywrócenie i utworzenie nowej migracji, z wyjątkiem złej.
Dzięki
źródło
Odpowiedzi:
Masz 2 opcje:
Możesz zdjąć Down ze złej migracji i umieścić ją w nowej migracji (będziesz musiał również wprowadzić kolejne zmiany w modelu). To skutecznie przechodzi do lepszej wersji.
Używam tej opcji w przypadku rzeczy, które trafiły do wielu środowisk.
Inną opcją jest faktyczne uruchomienie
Update-Database –TargetMigration: TheLastGoodMigration
we wdrożonej bazie danych, a następnie usunięcie migracji z rozwiązania. Jest to coś w rodzaju alternatywy dla hulk smash i wymaga wykonania tej operacji na dowolnej bazie danych wdrożonej w złej wersji.Uwaga: aby ponownie przenieść migrację do sieci, możesz użyć
Add-Migration [existingname] -Force
. Spowoduje to jednak zastąpienie istniejącej migracji, więc pamiętaj, aby zrobić to tylko wtedy, gdy usunąłeś istniejącą migrację z bazy danych. Działa to tak samo, jak usunięcie istniejącego pliku migracji i uruchomienieadd-migration
Korzystam z tej opcji podczas programowania.
źródło
Jak wskazuje pytanie, dotyczy to migracji w środowisku typu programistycznego, które nie zostało jeszcze wydane.
Ten problem można rozwiązać w następujących krokach: przywróć bazę danych do ostatniej dobrej migracji, usuń błędną migrację z projektu Entity Framework, wygeneruj nową migrację i zastosuj ją do bazy danych. Uwaga: Na podstawie komentarzy te dokładne polecenia mogą już nie mieć zastosowania, jeśli używasz EF Core.
Krok 1: Przywróć poprzednią migrację
Jeśli jeszcze nie zastosowałeś migracji, możesz pominąć tę część. Aby przywrócić schemat bazy danych do poprzedniego punktu, użyj polecenia Update-Database z opcją -TargetMigration, określ ostatnią dobrą migrację. Jeśli kod struktury jednostki znajduje się w innym projekcie w rozwiązaniu, może być konieczne użycie opcji „-Project” lub przełączenie domyślnego projektu w konsoli menedżera pakietów.
Aby uzyskać nazwę ostatniej dobrej migracji, użyj polecenia „Get-Migrations”, aby pobrać listę nazw migracji, które zostały zastosowane w Twojej bazie danych.
Ta lista pokazuje najpierw najnowsze zastosowane migracje. Wybierz migrację, która ma miejsce na liście po migracji, do której chcesz przejść na starszą wersję, tj. Migrację zastosowaną przed migracją, na którą chcesz obniżyć. Teraz wydaj aktualizację bazy danych.
Wszystkie migracje zastosowane po migracji zostaną obniżone w kolejności, zaczynając od najnowszej migracji zastosowanej jako pierwsza.
Krok 2: Usuń migrację z projektu
Jeśli
remove-migration
polecenie nie jest dostępne w Twojej wersji Entity Framework, usuń ręcznie pliki niechcianej migracji folderu „Migracje” projektu EF. W tym momencie możesz utworzyć nową migrację i zastosować ją do bazy danych.Krok 3: Dodaj nową migrację
Krok 4: Zastosuj migrację do bazy danych
źródło
add-migration "new migration"
,update-database
Dla osób używających EF Core z ASP.NET Core v1.0.0 miałem podobny problem i użyłem następujących poleceń, aby go poprawić (post @ DavidSopko wskazał mi właściwy kierunek, ale szczegóły są nieco inne dla EF Core) :
Na przykład w moim obecnym rozwoju polecenie stało się
Funkcja Remove-Migration usunie ostatnią zastosowaną migrację. Jeśli masz bardziej złożony scenariusz z wieloma migracjami do usunięcia (miałem tylko 2, początkową i złą), sugeruję przetestowanie kroków w fikcyjnym projekcie.
Obecnie nie wydaje się, aby było polecenie Get-Migrations w EF Core (v1.0.0), więc musisz zajrzeć do folderu migracji i zapoznać się z wykonanymi czynnościami. Jest jednak fajne polecenie pomocy:
Odświeżanie bazy danych w VS2015 SQL Server Object Explorer, wszystkie moje dane zostały zachowane, a migracja, którą chciałem przywrócić, zniknęła :)
Początkowo próbowałem samodzielnie usunąć migrację i stwierdziłem, że polecenie błędu jest mylące:
Są już sugestie dotyczące ulepszenia tego sformułowania, ale chciałbym, aby błąd mówił coś takiego:
Dane wyjściowe z polecenia pomocy EF Core są następujące:
źródło
Możesz także użyć
Spowoduje to przywrócenie i usunięcie ostatniej zastosowanej migracji
źródło
Najpierw zaktualizuj swoją ostatnią idealną migrację za pomocą tego polecenia:
Przykład:
Następnie ręcznie usuń nieużywaną migrację.
źródło
Update-Database 20180906131107_xxxx_xxxx
(bez myślnika) działało dla mnie. Żadna wersjaTargetMigration
jako przełącznik nie działała. Te polecenia wydają się być ruchomym celem (tj. Zmienić je w każdej wersji)?TargetMigration
Wydaje się , że od .NET Core 2.2 zniknął:Więc to działa teraz dla mnie:
Jak również (bez
-Migration
przełącznika):Ponadto nie można już czysto usuwać folderów migracji bez zsynchronizowania Migawki modelu. Więc jeśli nauczysz się tego na własnej skórze i skończysz z pustą migracją, w której wiesz, że powinny nastąpić zmiany, możesz uruchomić (żadne przełączniki nie są potrzebne do ostatniej migracji):
Spowoduje to wyczyszczenie bałaganu i przeniesie Cię tam, gdzie trzeba, mimo że ostatni folder migracji został usunięty ręcznie.
źródło
W przypadku EF 6 tutaj jest jedna linijka, jeśli dużo przebudowujesz rusztowania w trakcie opracowywania. Po prostu zaktualizuj zmienne, a następnie użyj strzałki w górę w konsoli menedżera pakietów, aby przepłukać i powtórzyć.
Dlaczego jest to konieczne? Nie jestem pewien, które wersje EF6 to ma zastosowanie, ale jeśli nowy cel migracji został już zastosowany, użycie `` -Force '' do ponownego szkieletowania w Add-Migration nie spowoduje ponownego szkieletu, ale zamiast tego utworzy nowy plik (to jest dobre rzecz, ponieważ nie chciałbyś stracić swojego „upadku”). Powyższy fragment kodu wykonuje najpierw 'Down', jeśli to konieczne, a następnie -Force działa poprawnie, aby ponownie ustawić rusztowanie.
źródło