Skip to content

1. Wprowadzenie

1.1. Objectif

Kod PDF z dokumentu jest dostępny |TUTAJ|.

Przykłady z dokumentu są dostępne |TUTAJ|.

Entity Framework to ORM (Object Relational Mapper) pierwotnie stworzony przez firmę Microsoft, a obecnie dostępny jako oprogramowanie open source [juillet 2012, http://entityframework.codeplex.com/]. W ramach kursu ASP.NET wykorzystuję następującą architekturę dla pewnej aplikacji internetowej:

Framework NHibernate [http://sourceforge.net/projects/nhibernate/] to ORM, który pojawił się przed Entity Framework. Jest to dojrzały produkt umożliwiający łączenie się z różnymi bazami danych. ORM izoluje warstwę [DAO] (obiekty dostępu do danych) od łącznika ADO.NET. To właśnie ORM wysyła polecenia SQL do łącznika. Warstwa [DAO] korzysta z kolei z interfejsu udostępnianego przez ORM. Ta z kolei zależy od ORM. Zatem zmiana ORM wiąże się ze zmianą warstwy [DAO].

Architektura ta dobrze radzi sobie ze zmianami w module SGBD.

Gdy warstwa [DAO] jest połączona bezpośrednio z łącznikiem ADO.NET, zmiana SGBD ma wpływ na warstwę [DAO]:

  • nie wszystkie warstwy SGBD mają te same typy danych;
  • elementy SGBD nie mają takich samych strategii generowania kluczy głównych;
  • SGBD zawiera elementy należące do SQL;
  • warstwa [DAO] mogła korzystać z bibliotek powiązanych z konkretnym SGBD;
  • ...

Gdy to ORM jest połączony z łącznikiem ADO.NET, zmiana SGBD oznacza zmianę konfiguracji ORM w celu dostosowania go do nowego SGBD. Warstwa [DAO] pozostaje bez zmian.

Framework Spring.NET [http://www.springframework.net/index.html] zapewnia integrację warstw aplikacji. Powyżej:

  • aplikacja ASP.NET zwraca się do Springa o odwołanie do warstwy [DAO];
  • Spring wykorzystuje plik konfiguracyjny, aby utworzyć tę warstwę i zwrócić do niej odwołanie.

Architektura ta dobrze radzi sobie ze zmianami warstw, o ile zachowują one ten sam interfejs. Zmiana powyższej warstwy [DAO] polega na modyfikacji pliku konfiguracyjnego Springa, tak aby nowa warstwa została zainicjowana zamiast starej. Ponieważ warstwy te implementują ten sam interfejs, a warstwa ASP.NET korzysta z tego interfejsu, warstwa ASP.NET pozostaje niezmieniona.

Mamy więc do czynienia z elastyczną i skalowalną architekturą. Aby to zademonstrować, zastąpimy warstwę ORM i NHibernate przez Entity Framework 5:

Postępować będziemy w kilku etapach:

  • zapoznamy się z Entity Framework 5 na przykładzie kilku plików SGBD;
  • zbudujemy warstwę [DAO2];
  • połączymy istniejącą aplikację ASP.NET z tą nową warstwą [DAO].

1.2. Wykorzystane narzędzia

Testy przeprowadzono na laptopie HP EliteBook z systemem Windows 7 Pro, procesorem Intel Core i7 i 8 GB pamięci RAM. Jako język programowania wykorzystamy C#.

W niniejszym dokumencie wykorzystano następujące narzędzia, z których wszystkie są dostępne bezpłatnie:

Środki programistyczne:

  • Visual Studio Express dla komputerów stacjonarnych 2012 [http://www.microsoft.com/visualstudio/fra/downloads];
  • Visual Studio Express dla sieci Web 2012 [http://www.microsoft.com/visualstudio/fra/downloads].

SGBD SQL Server Express 2012:

  • SGBD: [http://www.microsoft.com/fr-fr/download/details.aspx?id=29062];
  • narzędzie administracyjne: EMS, SQL Manager dla SQL Server Freeware, [http://www.sqlmanager.net/fr/products/mssql/manager/download].

SGBD Oracle Database Express Edition 11g wersja 2:

  • SGBD: [http://www.oracle.com/technetwork/products/express-edition/downloads/index.html];
  • narzędzie administracyjne: EMS SQL Manager for Oracle Freeware [http://www.sqlmanager.net/fr/products/oracle/manager/download];
  • klient Oracle dla .NET: ODAC 11.2 Release 5 (11.2.0.3.20) z narzędziami Oracle Developer Tools dla Visual Studio: [http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html].

SGBD MySQL 5.5.28:

  • SGBD: [http://dev.mysql.com/downloads/];
  • narzędzie administracyjne: EMS, SQL Manager dla MySQL, Freeware [http://www.sqlmanager.net/fr/products/mysql/manager/download].

SGBD PostgreSQL 9.2.1:

  • SGBD: [http://www.enterprisedb.com/products-services-training/pgdownload#windows];
  • narzędzie administracyjne: EMS SQL Manager dla PostgreSQL Freeware [http://www.sqlmanager.net/fr/products/postgresql/manager/download].

SGBD Firebird 2.1:

  • SGBD: [http://www.firebirdsql.org/en/firebird-2-1-5/];
  • narzędzie administracyjne: EMS SQL Manager for InterBase/Firebird Freeware [http://www.sqlmanager.net/fr/products/ibfb/manager/download].

LINQPad 4: narzędzie do nauki języka LINQ (Language INtegrated Query) [http://www.linqpad.net/, http://www.linqpad.net/GetFile.aspx?LINQPad4.zip].

1.3. Kody źródłowe

Kody źródłowe poniższych przykładów są dostępne pod adresem URL [TUTAJ].

Są to projekty Visual Studio 2012 o nazwach [1], zebrane w jednym rozwiązaniu o nazwie [2]. W folderze [databases] znajduje się osobny folder dla każdego używanego projektu SGBD. Znajdują się w nim skrypty SQL służące do generowania przykładowej bazy danych dla tych projektów SGBD.

1.4. Metoda

Aby zapoznać się z Entity Framework 5 Code First, zacząłem od następującej książki: „Professional ASP.NET MVC 3” autorstwa Jona Gallowaya, Phila Haacka, Brada Wilsona i Scotta Allena, wydanej przez wydawnictwo Wrox. W przykładowej aplikacji z tej książki autorzy używają Entity Framework (EF) jako ORM. Ponieważ nie znałem tego rozwiązania, przeszukałem internet, aby dowiedzieć się więcej. W ten sposób odkryłem, że najnowszą wersją jest EF 5 oraz że występują niekompatybilności z EF 4, ponieważ kod z książki przetestowany z EF 5 generował błędy kompilacji.

Następnie odkryłem, że istnieje kilka sposobów korzystania z EF:

  • Model First: istnieje wiele artykułów na temat tego podejścia do EF, na przykład [http://msdn.microsoft.com/en-us/data/ff830362.aspx]. Artykuł ten rozpoczyna się następująco:

Podsumowanie: W niniejszym artykule przyjrzymy się nowemu Entity Framework 4, który jest dostarczany wraz z .NET Framework 4 i Visual Studio 2010. Omówię, jak można podejść do jego wykorzystania z perspektywy „model first”, wychodząc z założenia, że projekt bazy danych można kierować na podstawie modelu oraz budować zarówno bazę danych, jak i warstwę dostępu do danych w sposób deklaratywny na podstawie tego modelu. Model zawiera opis danych przedstawionych jako encje i relacje, zapewniając potężne podejście do pracy z ADO.NET oraz umożliwiając rozdzielenie zagadnień poprzez abstrakcję między definicją modelu a jego implementacją.

ORM stanowi pomost między tabelami baz danych a klasami.

Powyżej,

  • po lewej stronie warstwy EF5 znajdują się obiekty, zwane encjami;
  • po prawej stronie warstwy EF5 znajdują się tabele bazy danych.

Warstwa [DAO] obsługuje obiekty obrazów z tabel bazy danych. Obiekty te są zgrupowane w kontekście trwałości i nazywane są encjami (Entity). Zmiany wprowadzone w encjach są odzwierciedlane, dzięki warstwie ORM, w tabelach bazy danych (wstawianie, modyfikacja, usuwanie). Ponadto warstwa [DAO] dysponuje językiem zapytań LINQ to Entity (Language INtegrated Query), który pozwala na wysyłanie zapytań dotyczących encji, a nie tabel. Metoda „Model First” polega na tworzeniu encji za pomocą narzędzia graficznego. Definiuje się każdą encję oraz relacje łączące ją z innymi. Po wykonaniu tej czynności narzędzie pozwala wygenerować:

  • różne klasy odzwierciedlające encje utworzone graficznie;
  • plik DDL (język definiowania danych), umożliwiający wygenerowanie bazy danych.

Wszystkie przykłady dotyczące tej metody, które znalazłem, wykorzystywały program Visual Studio 2010 Professional oraz model o nazwie ADO.NET Entity Data Model. Udało mi się przetestować ten model w programie Visual Studio 2010 Professional, ale kiedy przeszedłem na Visual Studio Express 2012, który był moim celem, stwierdziłem, że model ten nie jest już dostępny. Zrezygnowałem więc z tego podejścia.

  • Database First: punktem wyjścia tej metody jest istniejąca baza danych. Na tej podstawie narzędzie automatycznie generuje encje odzwierciedlające tabele bazy. Również w tym przypadku znalezione przykłady, na przykład [http://msdn.microsoft.com/en-us/data/gg685489.aspx], wykorzystują Visual Studio 2010 Professional oraz model ADO.NET Entity Data Model. Zrezygnowałem więc również z tego podejścia, które było jednak moim ulubionym. Aby dowiedzieć się, jakie encje wykorzystać jako odwzorowanie istniejącej bazy danych, wystarczyło zacząć od narzędzia, które je generuje.
  • Code First: samodzielnie piszemy klasy, które będą tworzyć encje. Wymaga to jednak minimalnej wiedzy na temat działania EF. Wybrałem tę metodę, ponieważ można ją było zastosować w Visual Studio Express 2012.

Mając to za sobą, pracowałem w następujący sposób:

  • pisałem kod dla SQL Server Express 2012, ponieważ właśnie dla tej wersji SGBD można znaleźć najwięcej przykładów;
  • po wydebugowaniu tego kodu przenosiłem go na pozostałe wersje SGBD (Firebird, Oracle, MySQL, PostgreSQL).

W tym przypadku postąpimy inaczej. Najpierw opiszę wszystkie kody dla serwera SQL, a następnie opiszę ich przeniesienie na pozostałe serwery SGBD. Podczas tego przenoszenia wprowadzono następujące dostosowania:

  • bazy danych mają specyficzne cechy wynikające z rozwiązań własnościowych. W szczególności wykorzystałem wyzwalacze (triggery) do automatycznego generowania zawartości niektórych kolumn. Każdy serwer SGBD ma swój własny sposób obsługi tej funkcji;
  • entities obrazów w tabelach mogą ulec zmianie, ale jest to zamierzone. Mógłbym wybrać entities pasujące do wszystkich baz danych;
  • sterownik ADO.NET dla SGBD ulega zmianie;
  • Zmienia się łańcuch połączenia z SGBD.

Postępowanie jest następujące:

  • powiązanie obiektów z bazą danych. Wypełnienie bazy;
  • zrzut bazy danych za pomocą zapytań LINQ;
  • LINQPad, narzędzie szkoleniowe do LINQ;
  • dodawanie, usuwanie i modyfikowanie obiektów;
  • zarządzanie konkurencją dostępu;
  • kontekst trwałości zapisany w transakcji;
  • modyfikacja encji poza kontekstem trwałości;
  • ładowanie typu „eager” i „lazy”;
  • budowa warstwy [DAO];
  • budowa warstwy internetowej ASP.NET.

1.5. Grupa docelowa

Dokument ten jest skierowany do początkujących.

Niniejszy dokument nie stanowi kursu na temat Entity Framework 5 Code First. W tym celu warto zapoznać się na przykład z książką „Programming Entity Framework: Code First” autorstwa Julie Lerman i Rowana Millera, wydaną przez O'Reilly. Dokument ten nie ma na celu przedstawienia wyczerpującego omówienia tematu, a jedynie opisuje podejście, które zastosowałem, aby zrozumieć ten plik ORM. Uważam, że podejście to może okazać się przydatne dla innych osób rozpoczynających pracę z EF5. Mój cel nie wykracza poza ten zakres.

1.6. Powiązane artykuły na temat developpez.com

Jako punkt odniesienia posłuży cytowana powyżej książka. Istnieją również artykuły poświęcone Entity Framework na developpez.com. Oto kilka z nich:

Jak wspomniano powyżej, niniejszy dokument nie jest wyczerpujący. Warto zapoznać się z powyższymi artykułami, aby uzupełnić pewne braki. Moje poszukiwania mogły być niekompletne. Proszę o wyrozumiałość autorów, o których mogłem zapomnieć.