Daily Archives: Marzec 8, 2016

Entity Framework Code First Migrations

Entity Framework to kolejna generacja technologii firmy Microsoft, która zapewnia dostęp do danych. Jest to rozszerzona technologia ORM (ang. Object Rational Mapping), która ułatwia powiązanie danych w bazie danych z obiektami w aplikacji, poprzez stworzenie abstrakcyjnych modeli obiektowych w aplikacji z modeli relacyjnych lub logicznych. Dzięki temu możliwe jest tworzenie zapytań i manipulowanie danymi używając programowania zorientowanego obiektowo.
Używając Entity Framework możliwe są trzy podejścia do wyboru: Code First, Database First i Model First. Podejście Code First polega na zdefiniowaniu za pomocą kodu w języku C# typów odpowiadających modelowi danych, na podstawie którego zostanie wygenerowany schemat bazy danych. Przeciwieństwem jest podejście Model First, gdzie najpierw tworzy się model bazy danych korzystając z gotowego narzędzia w Visual Studio, a schemat bazy oraz odpowiadające mu klasy zostaną wygenerowane automatycznie przez Entity Framework. Database First z kolei polega na samodzielnym stworzeniu bazy danych, a następnie jej importowaniu, po czym tworzone są odpowiednie klasy.

Jak stworzyć bazę danych przy użyciu EF i podejścia Code First?
Tworzymy nowy projekt ASP.NET Web Application z szablonem Empty. Następnie przechodzimy do Nuget Package Managera i wyszukujemy pakiety takie jak widoczne na obrazku poniżej.

clip_image001

clip_image002

clip_image003

Kolejnym krokiem jest stworzenie modeli.

clip_image004

Poniżej przykład jednego modelu EventType.

Musimy także pamiętać o dodaniu klasy kontekstu. Kontekst musi zawierać także właściwości, które reprezentować będą tabele w bazie danych. W kontekście możemy dodatkowo przeciążyć metodą OnModelCreating, gdzie możemy wprowadzić trochę ustawień, np.:
usunięcie konwencji nazewnictwa tabel w liczbie mnogiej,

usunięcie konwencji usuwania kaskadowego,

czy też włączenie kaskadowego usuwania dla konkretnego powiązania między tabelami, za pomocą FluentAPI.

Prawidłowo stworzony kontekst w przypadku mojego projektu wygląda obecnie tak:

Gdy warstwę modelu mamy już stworzoną, możemy przystąpić do migracji, czyli aktualizacji struktury bazy danych lub raczej jej utworzenia, ponieważ jest to pierwsza migracja. W tym celu otwieramy konsolę Package Managera.

clip_image005

Upewniamy się żę Default project to ten dla którego chcemy włączyć migracje. Wpisujemy polecenie Enable-Migrations i dajemy enter.

clip_image006

Jeśli pojawi się błąd tak jak na poniższym obrazku, oznacza to że w którejś z encji zapomnieliśmy dodać właściwość Id.

clip_image007

W tym przypadku chodzi o klasę Location, tak więc dodajemy:

i wywołujemy polecenie raz jeszcze, ale tym razem konieczne jest dodanie parametru -Force:

w przeciwnym wypadku dostaniemy komunikat:

„Migrations have already been enabled in project ‚Repository’. To overwrite the existing migrations configuration, use the -Force parameter.”

Po dodaniu migracji do projektu zostanie dodany folder Migrations z klasą Configuration.cs.

clip_image008

Kolejny krok to wywołanie polecenia, które utworzy migrację startową. Spowoduje to utworzenie nowej klasy w folderze Migrations, dziedziczącej po DbMigration, która zawiera dwie metody Up() i Down(). Jak się można domyśleć metoda Up() zawiera zmiany jakie mają zostać wprowadzone w bazie danych, natomiast metoda Down() jest przeciwieństwem, czyli odwraca zmiany wprowadzone przez metodę Up().

clip_image009

Kolejny krok to aktualizacja bazy danych.

clip_image010

Teraz możemy sprawdzić efekt, otwierając Server Explorera z zakładki View. Jak widać tabele zostały utworzone. W przypadku wprowadzenia zmian w modelu i kolejnej migracji, struktura bazy danych zostanie zaktualizowana, bez utracenia danych w niej zawartych.

clip_image011.png