1. Вступ
1.1. Objectif
PDF документа доступний |TYT|.
Приклади з документа доступні за посиланням |TYT|.
Entity Framework — це ORM (об’єктно-реляційний мапер), спочатку створений компанією Microsoft, а зараз доступний як відкрите програмне забезпечення [juillet 2012, http://entityframework.codeplex.com/]. У курсі ASP.NET я використовую таку архітектуру для певного веб-додатка:
![]() |
Фреймворк NHibernate [http://sourceforge.net/projects/nhibernate/] — це ORM, що з’явився ще до Entity Framework. Це зрілий продукт, що дозволяє підключатися до різних баз даних. ORM ізолює рівень [DAO] (об’єкти доступу до даних) від коннектора ADO.NET. Саме ORM надсилає команди SQL до коннектора. У свою чергу, рівень [DAO] використовує інтерфейс, що надається ORM. Останній залежить від ORM. Отже, зміна ORM означає необхідність змінити рівень [DAO].
Ця архітектура добре витримує зміни в SGBD.
Коли шар [DAO] підключено безпосередньо до з’єднувача ADO.NET, зміна SGBD впливає на шар [DAO]:
- не всі SGBD мають однакові типи даних;
- SGBD не мають однакових стратегій генерації первинних ключів;
- SGBD містять власницькі елементи SQL;
- рівень [DAO] міг використовувати бібліотеки, пов’язані з конкретним SGBD;
- ...
Коли ORM пов’язаний із з’єднувачем ADO.NET, заміна SGBD означає зміну конфігурації ORM для її адаптації до нового SGBD. Рівень [DAO] не змінюється.
Фреймворк Spring.NET [http://www.springframework.net/index.html] забезпечує інтеграцію рівнів додатка. Вище:
- додаток ASP.NET запитує у Spring посилання на рівень [DAO];
- Spring використовує файл конфігурації, щоб створити цей рівень і повернути посилання на нього.
Ця архітектура добре витримує зміни шарів, якщо вони мають однаковий інтерфейс. Зміна шару [DAO], наведеного вище, полягає у зміні конфігураційного файлу Spring, щоб новий шар був інстанційований замість старого. Оскільки обидва шари реалізують один і той самий інтерфейс, а шар ASP.NET використовує цей інтерфейс, шар ASP.NET залишається без змін.
Отже, ми маємо гнучку та масштабовану архітектуру. Щоб продемонструвати це, ми замінимо ORM та NHibernate на Entity Framework 5:
![]() |
Ми будемо діяти у кілька етапів:
- ознайомимося з Entity Framework 5 на прикладі кількох SGBD;
- створимо шар [DAO2];
- підключимо існуючий додаток ASP.NET до цього нового шару [DAO].
1.2. Використані інструменти
Тестування проводилося на ноутбуці HP EliteBook з Windows 7 Pro, процесором Intel Core i7 та 8 ГБ RAM. Як мову розробки ми використовуватимемо C#.
У цьому документі використовуються такі інструменти, які доступні безкоштовно:
Інструменти для розробки:
- Visual Studio Express для настільних ПК 2012 [http://www.microsoft.com/visualstudio/fra/downloads];
- Visual Studio Express для веб-розробки 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];
- інструмент адміністрування: EMS, SQL Manager для SQL Server Freeware, [http://www.sqlmanager.net/fr/products/mssql/manager/download].
SGBD Oracle Database Express Edition 11g, версія 2:
- SGBD: [http://www.oracle.com/technetwork/products/express-edition/downloads/index.html];
- інструмент адміністрування: EMS SQL Manager for Oracle Freeware [http://www.sqlmanager.net/fr/products/oracle/manager/download];
- клієнт Oracle для .NET: ODAC 11.2 Release 5 (11.2.0.3.20) з Oracle Developer Tools для 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/];
- інструмент адміністрування: EMS, SQL Manager для MySQL, безкоштовна версія [http://www.sqlmanager.net/fr/products/mysql/manager/download].
SGBD PostgreSQL 9.2.1:
- SGBD: [http://www.enterprisedb.com/products-services-training/pgdownload#windows];
- інструмент адміністрування: EMS SQL Manager для 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/];
- інструмент адміністрування: EMS SQL Manager для InterBase/Firebird Безкоштовна програма [http://www.sqlmanager.net/fr/products/ibfb/manager/download].
LINQPad 4: навчальний інструмент для LINQ (Language INtegrated Query) [http://www.linqpad.net/, http://www.linqpad.net/GetFile.aspx?LINQPad4.zip].
1.3. Вихідні коди
Вихідні коди наведених нижче прикладів доступні за посиланням URL [http://tahe.developpez.com/dotnet/ef5cf].
![]() |
Це проекти Visual Studio 2012 [1], об’єднані в одне рішення [2]. У папці [databases] міститься по одній папці на кожен використаний SGBD. У них знаходяться скрипти SQL для генерації прикладної бази даних для цих SGBD.
1.4. Метод
Щоб ознайомитися з Entity Framework 5 Code First, я спочатку взяв за основу таку книгу: «Professional ASP.NET MVC 3» авторів Джона Галлоуея, Філа Хаака, Бреда Вілсона та Скотта Аллена, видану видавництвом Wrox. У прикладі додатка з цієї книги автори використовують Entity Framework (EF) як ORM. Оскільки я не знав про це, я пошукав інформацію в Інтернеті, щоб дізнатися більше. Так я дізнався, що найновішою версією є EF 5 і що існують несумісності з EF 4, оскільки код із книги, протестований із EF 5, містив помилки компіляції.
Потім я дізнався, що існує кілька способів використання EF:
- «Model First»: існує чимало статей про цей підхід до EF, наприклад, [http://msdn.microsoft.com/en-us/data/ff830362.aspx]. Ця стаття починається так:
Короткий зміст: У цій статті ми розглянемо новий Entity Framework 4, що постачається разом із .NET Framework 4 та Visual Studio 2010. Я розповім, як підійти до його використання з точки зору підходу «модель спочатку», виходячи з того, що ви можете керувати проектуванням бази даних на основі моделі та декларативно будувати як саму базу даних, так і рівень доступу до даних на основі цієї моделі. Модель містить опис ваших даних, представлених у вигляді сутностей та взаємозв’язків, що забезпечує потужний підхід до роботи з ADO.NET, створюючи розділення функціональних областей за допомогою абстракції між визначенням моделі та її реалізацією.
ORM слугує мостом між таблицями бази даних та класами.
![]() |
Вище,
- ліворуч від шару EF5 розташовані об’єкти, які називаються сутностями;
- праворуч від шару EF5 — таблиці бази даних.
![]() |
Шар [DAO] працює з об’єктами-зображеннями з таблиць бази даних. Ці об’єкти об’єднані в контекст персистентності та називаються сутностями (Entity). Зміни, внесені в сутності, завдяки шару ORM, відображаються у таблицях бази даних (вставлення, зміна, видалення). Крім того, рівень [DAO] має мову запитів LINQ to Entity (Language INtegrated Query), яка виконує запити до сутностей, а не до таблиць. Метод «Model First» полягає у створенні сутностей за допомогою графічного інструменту. Ви визначаєте кожну суть та відносини, що пов’язують її з іншими. Після цього інструмент дозволяє згенерувати:
- різні класи, що відображають ентітети, побудовані графічно;
- DDL (Data Definition Language), що дозволяє створити базу даних.
Усі приклади, які я знайшов щодо цього методу, використовували Visual Studio 2010 Professional та модель під назвою ADO.NET Entity Data Model. Мені вдалося протестувати цю модель у Visual Studio 2010 Professional, але коли я перейшов на Visual Studio Express 2012, який був моєю ціллю, я виявив, що ця модель більше не доступна. Тому я відмовився від цього підходу.
- «Database First»: відправною точкою цього методу є існуюча база даних. На її основі інструмент автоматично генерує сутності, що відображають таблиці бази. І тут знову знайдені приклади, наприклад [http://msdn.microsoft.com/en-us/data/gg685489.aspx], використовують Visual Studio 2010 Professional та модель ADO.NET Entity Data Model. Тому я також відмовився від цього підходу, хоча він і був моїм улюбленим. Щоб дізнатися, які сутності використовувати як зображення існуючої бази даних, було просто почати з інструменту, який їх генерує.
- «Code First»: ми самостійно пишемо класи, які утворюватимуть сутності. Для цього потрібно мати хоча б мінімальні уявлення про роботу EF. Саме цим шляхом я й пішов, оскільки його можна було реалізувати за допомогою Visual Studio Express 2012.
Опанувавши це, я працював таким чином:
- я писав код для SQL Server Express 2012, оскільки саме для цієї версії SGBD можна знайти найбільшу кількість прикладів;
- після налагодження цього коду я переносив його на інші версії SGBD (Firebird, Oracle, MySQL, PostgreSQL).
Тут ми будемо діяти інакше. Спочатку я опишу всі коди для SQL Server, а потім — їхнє перенесення на інші SGBD. Під час цього перенесення відбуваються такі коригування:
- бази даних мають власні особливості. Зокрема, я використовував тригери для автоматичного генерування вмісту деяких стовпців. Кожен SGBD має свій власний спосіб управління цим;
- елементи таблиць, що містять зображення, можуть змінюватися, але це робиться свідомо. Я міг би вибрати елементи, що підходять для всіх баз даних;
- драйвер ADO.NET для SGBD змінюється;
- Змінюється ланцюг підключення до SGBD.
Процес відбувається наступним чином:
- встановлення зв’язків між сутностями та базою даних; заповнення бази даних;
- вивантаження бази даних за допомогою запитів LINQ;
- LINQPad — навчальний інструмент для LINQ;
- додавання, видалення, зміна об’єктів;
- управління конкуренцією доступу;
- контекст збереження даних, збережений у транзакції;
- зміна сутності поза контекстом збереження;
- Eager та Lazy loading;
- побудова веб-шару [DAO];
- побудова веб-шару ASP.NET.
1.5. Цільова аудиторія
Цей документ призначений для початківців.
Цей документ не є курсом з Entity Framework 5 Code First. Для цього можна, наприклад, прочитати книгу «Programming Entity Framework: Code First» авторства Джулі Лерман та Роуена Міллера, видану видавництвом O'Reilly. Цей документ жодним чином не претендує на вичерпність, а лише висвітлює підхід, який я використовував для освоєння цього ORM. Я вважаю, що цей підхід може бути корисним для інших осіб, які починають працювати з EF5. Моя мета не виходить за межі цього контексту.
1.6. Статті на тему developpez.com
Згадана вище книга слугуватиме довідковим матеріалом. Крім того, на developpez.com є статті, присвячені Entity Framework. Ось декілька з них:
- «Entity Framework — підхід Code First», червень 2012 року — автор Reward. Ця стаття та даний документ частково перетинаються. Однак у ній більш детально розглядаються деякі питання, зокрема «маппінг» успадкування класів <--> таблиць;
- «Вступ до Entity Framework», грудень 2008 р., автор — Paul Musso;
- «Створення моделі класів за допомогою Entity Framework», квітень 2009 р., автор — Jérôme Lambert;
- «Вимірювання продуктивності Linq to SQL у порівнянні з Sql та Entity Framework», червень 2011 р., автор: Immobilis;
- «Entity Framework Code First: увімкнення автоматичної міграції», червень 2012 р., автор — Ромарік Іно;
- «Створення додатка CRUD за допомогою WebMatrix, Razor та Entity Framework», травень 2012 р., автор — Ромарік Іно;
- «Entity Framework: знайомство з Code First Migrations», червень 2012 р., автор — Ромарік Іно;
Як зазначено вище, цей документ не є вичерпним. Для заповнення деяких прогалин рекомендується ознайомитися з наведеними вище статтями. Моє дослідження могло бути неповним. Прошу вибачення у тих авторів, яких я, можливо, забув згадати.




