Skip to content

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. Ось декілька з них:

Як зазначено вище, цей документ не є вичерпним. Для заповнення деяких прогалин рекомендується ознайомитися з наведеними вище статтями. Моє дослідження могло бути неповним. Прошу вибачення у тих авторів, яких я, можливо, забув згадати.