Entity Framework Database First

W jednym z artykułów dotyczących Entity Framework opisywałem na czym polega podejście Code First. Dzisiaj omówimy drugi, czyli Database First. W nim będziemy głównie skupiać się na modelowaniu bazy danych bezpośrednio w narzędziach do tego przeznaczonych niż oprogramowywanie jej w naszej aplikacji. Zobaczysz, że w tym podejściu wszystkie klasy oraz konteksty są generowane automatycznie. Nie musimy ich definiować, opisywać czy dbać o odpowiednie nazewnictwo. Całą kontrolę przejmuje środowisko programistyczne. Po naszej stronie dbamy tylko o odpowiednią strukturę tabel i relacji. Zatem tutaj będzie już potrzebna znajomość SQL i baz danych. Mamy tutaj jednak okazję zoptymalizować co nieco podnosząc tym samym wydajność jednakże wygoda utrzymywania kodu dostępowego do baz musi zejść już na dalszy plan. Widzimy, więc tu pewny kompromis, polegający na tym, że większą uwagę przykuwamy bardziej do samego SQL niż kodu naszej aplikacji. Zanim zacznę omawiać zastosowania podejścia Database First przejdźmy najpierw do praktycznej prezentacji.

Modelowanie bazy danych

W podejściu Database First dla Entity Framework musimy najpierw zacząć od zamodelowania bazy danych. Nasze środowisko programistyczne odkładamy na bok, a uruchamiamy narzędzie bazodanowe. W moim przypadku będzie do SQL Management Studio. W nim utworzę strukturę bazy danych. Aby nie tracić czasu wykorzystam ten sam schemat bazy co w artykule Entity Framework Code First. Jest on najprostszy i idealnie nadaje się do prezentacji na przykładzie.

Model bazy danych dla Entity Framework

Oto model wykonany w SQL Management Studio. Celem bazy jest przechowywanie danych o użytkownikach, należących do nich komputerów oraz oprogramowania jakie jest zainstalowane na tych komputerach. Model bardzo prosty składający się z 4 tabel, w tym jedna relacyjna. Dla dokładniejszego zobrazowania sytuacji dorzucam jeszcze strukturę poszczególnych tabel.

Struktura wszystkich tabel modelu dla Entity Framework

W bazie dokładnie odtworzyłem wszystkie kolumny zgodnie z założeniami. Czyli odpowiednia ilość znaków, klucze główne, klucze obce, dopuszczalne wartości zerowe oraz odpowiednie typy danych. W jaki sposób to zrobiłem? Tutaj odsyłam Cię do innych moim wpisów poświęconym modelowaniu baz danych przy pomocy odpowiednich narzędzi. Ten poświęcony jest głównie bibliotece Entity Framework. Z taką gotową bazą danych możemy już przejść do kodu naszej aplikacji.

Odtworzenie modelu bazy w Entity Framework

Mamy już bazę danych. Teraz jej model musimy odtworzyć w postaci klas. W podejściu Database First nie będziemy robić tego ręcznie chociaż można. Wystarczy, tak jak w przypadku Code First, utworzyć odpowiednie klasy odpowiadające naszym tabelom z odpowiednimi typami oraz atrybutami (aczkolwiek atrybuty również nie są konieczne). Potem tworzymy kontekst i wywołujemy go w naszej aplikacji. Tym razem nie tworzymy instrukcji odtwarzających naszą strukturę, ponieważ już ją mamy. Takie czynności mijają się jednak z celem podejścia Database First. Dlatego zrobimy to w inny sposób. Przede wszystkim automatycznym. Przechodzimy do naszego rozwiązania oraz projektu. Dodajemy nowy element.

Dodawanie modelu do projektu Entity Framework

Wybieramy LINQ to SQL Classes. Utworzymy w ten sposób projekt naszego kontekstu i modelu. Zostanie utworzony projektant, ale żeby dodać w nim jakieś tabele należy najpierw stworzyć połączenie do naszej bazy, aby można było przeciągnąć tabele. Wchodzimy w okienko Eksplorator serwera (jeśli go nie widzisz to odsłonisz go w widoku). Kliknij na Połączenie danych prawym przyciskiem myszy, a następnie na Dodaj połączenie.

Nowe połączenie z bazą w Entity Framework

Zostawiamy wybór na Microsoft SQL Server i przechodzimy dalej klikając na Kontynuuj.

Wybór źródła danych w Entity Framework

Uzupełniamy dane dotyczące połączenia naszego SQL Server’a. Wpisujemy nazwę serwera wraz z wystąpieniem usługi, gdzie przeważnie domyślnie jest to SQLEXPRESS. Następnie wybieramy tryb uwierzytelnienia. W moim przypadku jest to SQL Server. Następnie nazwa użytkownika i hasło. Niżej musimy wybrać lub wpisać nazwę naszej bazy. Dla pewności przetestuj połączenie przyciskiem Testuj połączenie, a następnie naciśnij na OK.

Okno edycji połączenia z bazą danych

W środowisku Visual Studio powinniśmy zobaczyć tabele naszej bazy danych.

Widok tabel w środowisku Visual Studio

Jest to cała struktura, która stworzyłem po stronie serwera. Teraz trzeba je dodać do naszego modelu. Sprawa jest oczywiście bardzo prosta. Wystarczy zaznaczyć SHIFT’em wszystkie i przeciągnąć do naszego obszaru roboczego modelu. Zostaną przerobione na klasy, a na obszarze roboczym pojawi się diagram relacyjny.

Diagram relacyjny bazy danych w Visual Studio dla Entity Framework

Po zapisaniu projektu stworzy nam się również automatycznie kontekst do którego będziemy się odwoływać. Oprócz tego w pliku konfiguracyjnym zapisze się nasz ciąg połączenia do bazy danych jaki podałem podczas łączenia z SQL Server’em. Teraz możemy przejść do naszej aplikacji i korzystać z naszych danych.

Pobieranie danych z kontekstu Entity Framework

Czas zacząć korzystać z bazy danych. W głównej metodzie mojej aplikacji konsolowej mogę stworzyć obiektu kontekstu. Przeważnie nazywa się on tak samo jak nazwa projektu z dopiskiem DataContext. Zatem kod wywołania będzie wyglądał następująco.

DataClasses1DataContext context = new DataClasses1DataContext();

Możemy to oczywiście podejrzeć przechodząc do okna rozwiązania i rozwijając projekt dbml. Zobaczysz tam wtedy nazwę klasy kontekstu. Obiekt stworzony, a więc możemy już pobierać dane. W kontekście odwołujemy się do kolekcji. Ich nazwy są takie same jak w naszym wygenerowanym diagramie.

DataClasses1DataContext context = new DataClasses1DataContext();
List users = context.Users.ToList();

foreach (var item in users)
    Console.WriteLine("Imie: " + item.Surname + " Nazwisko: " + item.Forename);

Console.ReadKey();

W efekcie powinienem dostać imiona i nazwiska użytkowników. Oczywiście pod warunkiem, że są w bazie danych.

Ta sama zasada tyczy się innych tabel. Kreator automatycznie odtwarza relacje, zatem jeśli chcemy zwrócić liczbę komputerów danego użytkownika wystarczy odwołać się do pola Computers lub na odwrót. Pobrać komputer, a potem zwrócić użytkownika, który go posiada. W ten sposób mamy już zaimplementowany Entity Framework.

Operacje dodawania, aktualizacji i usuwania

Baza danych bez zawartości nie ma żadnego sensu w związku z tym trzeba zacząć do niej dodawać wartości. Podobnie jak w podejściu Code First tak i tutaj możemy w bardzo prosty sposób tworzyć nowe obiekty naszego modelu i wysyłać je do bazy w postaci zapytania. Zacznijmy od dodawania nowego użytkownika. Kod będzie wyglądał teraz następująco.

DataClasses1DataContext context = new DataClasses1DataContext();

Users user = new Users()
{
	Surname = "Jan"	
	Forename = "Kowalski",
	Login = "j.kowalski",
	Password = "haslo123",
	Email = "jan.kowalski@domain.com",
	Created = DateTime.Now,
	Active = true
};

context.Users.InsertOnSubmit(user);
context.SubmitChanges();

Console.ReadKey();

Tradycyjnie tworzymy kontekst, a następnie obiekt użytkownika, który ze względu na przyjmowaną nazwę z bazy danych nazywa się Users. Uzupełniamy jego właściwości, a następnie dodajemy do kolekcji metodą InsertOnSubmit(). Na koniec zapisujemy zmiany i wysyłamy do bazy. W naszej tabeli powinien pojawić się nowy wiersz.

Gdybym chciał teraz zmienić adres email temu użytkownikowi wystarczy, że pobiorę jego obiekt, zmienię właściwość i zapiszę zmiany.

DataClasses1DataContext context = new DataClasses1DataContext();

var user = context.Users.Single(x => x.Surname == "Jan" && x.Forename == "Kowalski");
user.Email = "nowy.adres@domena.com";

context.SubmitChanges();

Console.ReadKey();

Usuwanie z kolei odbywa się metodą DeleteOnSubmit(). W parametrze przekazujemy obiekt, który chcemy usunąć. Musimy go wcześniej pobrać.

DDataClasses1DataContext context = new DataClasses1DataContext();

var user = context.Users.Single(x => x.Surname == "Jan" && x.Forename == "Kowalski");
context.Users.DeleteOnSubmit(user);

context.SubmitChanges();

Console.ReadKey();

Po tym zabiegu nasz użytkownik Jan Kowalski zniknie z bazy danych. W ten oto sposób przeprowadziliśmy podstawowe operacje na bazie danych.

Podsumowanie

W tym wpisie pokazałem jak połączyć się z bazą danych korzystając z podejścia Database First. Najpierw zacząłem od stworzenia modelu. Potem umieściłem go na serwerze. Kiedy struktura bazy była gotowa mogłem przejść do kreatora Entity Framework, gdzie tu krok po kroku pokazałem jak połączyć się i odtworzyć model w kodzie naszej aplikacji. Dalej standardowe operacje pobierania, dodawania, aktualizacji i usuwania danych.

Jak zapewne zauważyłeś podejście Database First pozwala na większą automatyzację czynności związanych z dostępem. Po stronie swojej aplikacji nie musiałem praktycznie nic robić. Wszystko zrobił za mnie program. Moim zadaniem było tylko utworzenie bazy danych na serwerze, a następnie podanie do niej namiarów. I chodź automatyzacja jest ważna to w pewnym sensie tracimy kontrolę nad nazewnictwem i strukturą naszych obiektów. Nie przyjmują one nazwa w liczbie pojedynczej, lecz na podstawie nazwy tabeli. Co zapewne jest to kwestia wizualna.

Mam nadzieję, że spodobał Ci się mój artykuł w przyszłości pomoże Ci z wyborem właściwego podejścia w twoim projekcie.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *