Пишемо шар доступу до даних c POCO та EF

Нещодавно оновився Entity Framework (EF) до версії 4.1, основне нововведення, яке з'явилося - це Code First, підхід і можливість працювати з POCO об'єктами. Але для людей, у яких вже була готова та спроектована база, все одно не виходило працювати з Code First, крім того багато хто, ім'я тямущих експертів з баз даних, вибирають традиційний шлях data-driven development.

Отже, цілком практичне завдання – швидко створити шар доступу до даних (data access layer), який буде оперувати з POCO об'єктами, з використанням Entity Framework, відштовхуючись від вже існуючої бази даних.

Багато хто напевно подумає, що є сенс вибрати nHibernate або ще якісь інші архітектурні рішення. Але це тема інших холиворів типу EF vs nHibernate, або, добре чи погано приймати архітектурні рішення в стилі “бо Майкрософт”, або “бо не-Майкрософт”, або “бо гладіолус”. Тут же маємо цілком практичне завдання та маємо EF.

Отже, варіант 1 - Entity Framework Power Tools

Нещодавно також оновилося розширення Visual Studio 2010 – Entity Framework Power Tools. Воно ще у CTP1, але свою справу робить чудово, принаймні у мене нарікань не було. Розширення додає контекстне меню до проекту.

доступу

Конектимося до бази:

доступу

Reverse engineering нагенерить нам POCO сутностей за базою та службові класи мапінгів.

POCO класи виду:

Як бачимо в них нічого зайвого, хіба наявність Nullable або віртуальних властивостей може видати такий клас. Пов'язані таблиці реалізуються як віртуальні властивості типу IC Collection. Проте це чисті об'єкти без зайвих залежностей.

Мапінгу доведеться трохи підредагувати. Якщо у вас вказуєтьсясхема БД у назві таблиць, необхідно в класах мапінгів додати цю схему в “магічних рядках” виду:

У принципі з цим можна жити маючи клас контекст. Але нам цього замало. Хочеться мати для цього звичайний Data access layer. А для гурманів хочеться такий шар із використанням патернів Repositorу, UnitOfWork. Щоб не робити багато рутини роботи будемо використовувати T4 Template.

Запустимо його. Отримай базові класи та реалізації показані нижче:

Базова конкретна реалізація інтерфейсу IRepository від цієї реалізації можна успадковувати свої конкретніші репозиторії:

Конкретна реалізація інтерфейсу IUnitOfWork:

Далі код показувати не буду тому що в принципі за інтерфейсами та базовими класами можна зрозуміти про що мова. Інший приклад рівня доступу до даних у додатку за посиланням наприкінці.

Покажу ще код використання такого шару доступу до даних:

Варіант 2 - ADO.NET C# POCO Entity Generator

Є й інший варіант якщо не гнатися за репозиторіями та unit of work у своєму коді. Теж генерує сутність. Ось тільки спосіб доступу до БД з використанням цих сутностей через клас контексту DbContext безпосередньо, хоча аналогічним чином можна все заврапити в репозиторії. За великим рахунком, що Entity Framework Power Tools, що ADO.NET C# POCO Entity Generator – дають нам об'єкти-сутності та мапінги.

А далі можемо, наприклад, використати Т4 скрипт з першого способу.

ADO.NET C# POCO Entity Generator знаходиться у галереї розширень.

Також є набір досить корисних посилань, у тому числі із використанням ADO.NET C# POCO Entity Generator.

Там серед них є посилання на те, як генерувати сутності за допомогою ADO.NET C# POCO Entity Generator або ще один спрощений варіант:

Хочаособисто для мене перший варіант, який я описав краще

Як використовувати POCO об'єкти з репозиторієм або без, це вже справа техніки або Т4 скрипта. Створення гідного шару доступу до даних в Entity Framework тепер зводиться до його генерації, як і в nHibernate