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:
- „Entity Framework – podejście Code First”, czerwiec 2012 r. – autor: Reward. Artykuł ten i niniejszy dokument częściowo się pokrywają. Jednak w niektórych kwestiach, zwłaszcza dotyczących mapowania dziedziczenia klas <--> tabel, autor idzie o krok dalej;
- „Wprowadzenie do Entity Framework”, grudzień 2008 r., autor: Paul Musso;
- „Tworzenie modelu klas za pomocą Entity Framework”, kwiecień 2009 r. – autor: Jérôme Lambert;
- „Pomiar wydajności Linq to SQL w porównaniu z Sql i Entity Framework”, czerwiec 2011 r., autor: Immobilis;
- „Entity Framework Code First: włączanie automatycznej migracji”, czerwiec 2012 r., autor: Hinault Romaric;
- „Tworzenie aplikacji CRUD przy użyciu WebMatrix, Razor i Entity Framework”, maj 2012 r., autor: Hinault Romaric;
- „Entity Framework: odkrywanie migracji Code First”, czerwiec 2012 r., autor: Hinault Romaric;
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ć.




