Podczas pracy z szybko rozwijającym się projektem zmiany zachodzą szybko nie tylko w kodzie projektu, ale także w schemacie bazy danych. Dzieje się tak zwłaszcza podczas pracy nad mikroserwisem od samego początku, kiedy często zmienia się jego przeznaczenie.
Jak działają migracje w EF Core 5
W migracjach Entity Framework Core 5 dodajemy migrację jako zmiany pomiędzy naszą klasą DbContext
a istniejącą [nazwa DbContext] ModelSnapshot
. Podczas generowania nowej migracji narzędzie CLI wygeneruje tylko różnice między tymi dwoma bytami i umieści je w dwóch metodach: Up
i Down
. W pierwszej nastąpi zmiana dotycząca zastosowania migracji, aw drugiej usunięcia migracji.
Po zastosowaniu migracji jej nazwa jest zapisywana w tabeli __EFMigrationsHistory
.
Scalanie wielu migracji
Powiedzmy, że po wielokrotnej zmianie schematu na wczesnych etapach nasz projekt jest teraz stabilny. Mamy kilka migracji, które można by połączyć w jedną, która raz stworzyłaby model, bez wielu małych aktualizacji.
Scalanie kiedy możemy wszystko usunąć
Najłatwiejszym sposobem scalenia wszystkich migracji byłoby usunięcie wszystkiego! A dokładnie mam na myśli taki proces:
- usuń katalog
Migrations
ze wszystkimi migracjami - wyczyść tabelę
__EFMigrationHistory
usuń wszystkie tabele i inne obiekty bazy danych, które zostały dodane podczas migracji
- utwórz nową migrację ze wszystkimi zmianami
Jest to drastyczny sposób scalania migracji, ponieważ utracimy wszystkie dane. Jest to jednak bardzo proste i może w niektórych przypadkach spełniać swoją rolę.
Scalanie, kiedy chcemy zachować dane
Kiedy chcemy zachować dane, nie możemy usunąć wszystkich już utworzonych obiektów bazy danych, ale możemy scalić pliki migracji w naszym kodzie. Zobaczmy, jak można to zrobić.
- Usuń wszystkie skrypty migracji z folderu
Migrations
- Dodaj nową migrację za pomocą polecenia
dotnet ef migrations add MergedMigration
- Skopiuj cały plik i wyczyść obie metody
Up
iDown
- Zaktualizuj bazę danych i zastosuj migrację
MergedMigration
za pomocą poleceniadotnet ef database update
- Następnie zamień zawartość pliku
MergedMigration
na wcześniej wygenerowany kod
W rezultacie będziesz mieć tylko jeden plik migracji. W moim przykładzie tabela __EFMigrationHistory
wygląda następująco.
A teraz w Visual Studio widzę tylko jedną migrację.
Zawiera ona zmiany ze wszystkich moich poprzednich migracji, które zostały scalone.
Zadziałało!
Wskazówka! Możesz również nazwać scaloną migrację tak jak pierwszą, która została już zastosowana, aby nie trzeba było aktualizować bazy danych i dodawać jej do tabeli __EFMigrationHistory
.
Nie zadziała za każdym razem
Migracje możemy łatwo łączyć, gdy są stosowane tylko do kontrolowanej przez nas bazy danych. Ponadto ten proces nie będzie działać w środowiskach, w których nie zastosowano wszystkich scalonych migracji. Proces jest łatwy, ale są pewne rzeczy, które należy zwrócić uwagę.
Z drugiej strony, czy musimy zachować wszystkie migracje, nawet jeśli wiemy, że nigdy więcej ich nie uruchomimy? Nie sądzę. W tym miejscu byłoby wspaniale połączyć stare migracje, ale zostawić te najnowsze. Można to osiągnąć w bardzo podobny sposób.
- Przywróć ostatnie N migracji lokalnie, jedna po drugiej i przenieś je gdzieś
- Przywróć stan projektu w miejscu pasującym do migracji (git checkout w odpowiednim miejscu w historii)
- Scal wszystkie istniejące migracje
- Przywróć stan projekt do najnowszej wersji
- Dodawaj po kolei zapisane najnowsze migracje
W takim przypadku zachowamy najnowsze migracje i utworzymy dużą migrację początkową, która byłaby zgodna z Twoim projektem. Jeśli wystąpi przypadek, w którym wszystkie migracje będą musiały zostać zastosowane do bazy danych, schemat bazy danych nie zostanie uszkodzony.
Podsumowanie
Scalanie migracji w Entity Framework Core 5 jest możliwe i mogę powiedzieć, że jest to zaskakująco łatwe. Obejmuje jednak proces automatycznego generowania i musisz sprawdzić, czy migracja scalona działa dokładnie tak samo, jak wszystkie migracje stosowane pojedynczo. Co więcej, istnieje więcej niż jeden sposób łączenia migracji i musisz wybrać ten, który jest dla Ciebie najbardziej odpowiedni.
Cały kod zamieszczony tutaj jest dostępny na moim GitHubie, więc możesz go pobrać i bawić się nim. Spójrz również na ten post, jak go uruchomić: PrimeHotel – jak uruchomić projekt.
Dzięki za czytanie i do zobaczenia ponownie 🙂