Sunday, August 9, 2009

Entity Framework 4.0: выходим на зрелый уровень

Я уже полгода не работаю с Entity Framework, но по былой памяти интерес все равно сохраняется. Как-то совсем упустил из виду, что вместе с выходом Visual Studio 2010 Beta 1 вышла и первая бета Entity Framework 4.0. Более того, спустя месяц ADO.NET team выпустил еще и Entity Framework 4.0 Feature CTP 1 (скачать можно здесь). В CTP 1 вошли еще три новые фичи, которые не успели довести до выхода VS 2010 Beta 1: Self Tracking Entities (о которых я уже немного рассказывал), POCO Template и Code Only.

Что это значит? Это значит, что в релизной версии 2010-й студии в составе .NET 4.0 этих фич тоже не будет. Daniel Simmons в подкасте .NET Rocks #451 как-то достаточно неясно сказал, что они вроде бы войдут в какой-то следующий релиз после VS 2010, хотя сам EFv4 будет релизиться вместе со студией. Ну, да это не так важно.

А важно вот что: в следующей версии EF разработчики проделали достаточно серьезную работу. Они действительно учли многие комментарии и критику, которые обрушились на первую версию EF, поэтому вторая версия EF с физическим номером 4.0 (Microsoft снова извратила нумерацию с целью упростить жизнь своим sales) будет ощутимо солиднее. Что же мы получим в новой версии:

1) Model First development approach

В EFv1 была лишь возможность сгенерировать модель по базе данных, а EFv4 обладает и обратной возможностью - сгенерировать базу данных по модели. Теперь вы можете сами выбрать, какой подход вам удобнее и работать, используя его. На мой взгляд, может подойти людям, работающим в рамках DDD, где база данных воспринимается как инфраструктура - средство для хранения (persistence) состояния объектов системы.

Подробнее о фиче:
Sneak Preview: Model First in the Entity Framework 4.0

2) Code Only development approach

Конечно, Database First и Model First подходы к разработке покрывают потребности почти всех разработчиков. Однако, также есть люди, которым нравится создавать свою модель прямо в коде. При чем делают они это, как правило, при помощи так называемых fluent-интерфейсов, то есть максимально читабельного кода, который заменяет конфигурирование при помощи XML (то есть EDMX-файлы уходят в прошлое). На данный момент еще не все возможности EDMX-конфигурации обзавелись своими аналогами, да и текущий API сложно назвать fluent, но к релизу, думаю, будет покрыт максимум возможных операций.

Подробнее о фиче:
Code Only design
Code Only enhancements
Feature CTP Walkthrough: Code Only for the Entity Framework
Next version of EF Code Only Design laid out by MS

3) Persistence Ignorance (POCO) support

То о чем так долго говорили и писали, наконец свершилось: ADO.NET team добавил в EFv4 поддержку Persistence Ignorance (PI). В EFv1 все сущности были унаследованы от EntityObject и таким образом "знали" о том, что где-то есть EF контекст, а EF контекст, в свою очередь, мог отслеживать изменения в этих объектах и использовать их в других целях. Такая привязка сущностей к инфраструктуре создавала много проблем с тестируемостью и реализацией сценариев, где нужны чистые POCO-объекты. Теперь же эта проблема решена: вы можете создавать POCO-объекты и при этом у вас сохраняться все инфраструктурные возможности EF: отслеживание и сохранение изменений, lazy/deferred loading, и др. Кроме того, у вас есть выбор, какой способ отслеживания изменений выбрать: snapshot-based или proxy-based, также вы можете создать свои собственные шаблоны для генерации POCO. Фича очень серьезная, возможностей много.

Подробнее о фиче:
Sneak Preview: Persistence Ignorance and POCO in Entity Framework 4.0
POCO in the Entity Framework: Part 1 - The Experience
POCO in the Entity Framework : Part 2 – Complex Types, Deferred Loading and Explicit Loading
POCO in the Entity Framework : Part 3 – Change Tracking with POCO
Feature CTP Walkthrough: POCO Templates for Entity Framework

4) Customization of Code Generation

После описания POCO и Code Only, разумно рассказать немного о механизме, который они частично (или полностью) используют. Если вы помните, первая версия EF генерировала код при помощи такой штуки, как CodeDOM. Надо сказать, что хотя это и мощная технология кодогенерации, кастомизировать ее невероятно сложно. Мы пробовали вклиниваться в процесс генерации EF сущностей на одном из проектов, но возможности там достаточно поверхностные. EFv4 генерирует сущности и класс контекста при помощи T4 (Text Template Transformation Toolkit), что позволяет просто отредактировать существующие текстовые шаблоны или написать и подключить свои - и все готово. Кроме того, переход на более простой способ генерации позволил реализовать и некоторые другие новые возможности, например, POCO или Code Only. Да и вообще, теперь вы можете генерировать все что угодно на основании своей модели - различные адаптеры, DTO, POCO-объекты, возможности кодогенерации почти безграничны.

Подробнее о фиче:
Sneak Peek – Using Code Generation Templates with the Entity Framework 4.0

Как кастомизировать шаблоны T4 в EF:
Customizing T4 Templates
Customizing EDM Code Gen in EF4
Feature CTP Walkthrough: POCO Templates for Entity Framework

5) Testability Improvements

Здесь, в принципе, все понятно. Все вышеназванные улучшения и еще пара новых наконец-то дают возможность писать нормальный код с поддержкой тестирования. Да и нормальная поддержка различных паттернов вроде Repository тоже не помешает.

Подробнее о фиче:
Sneak Preview: Entity Framework 4.0 Testability Improvements

6) Self-tracking entities

Идея проста - появились новые шаблоны T4, которые позволяют генерировать специальные сущности, не зависящие от ObjectContext и EF, но зато умеющие сами трекать изменения внутри себя. Когда это может пригодится? Например, когда вы хотите сериализовать свои сущности, отправить их куда-то в другое место (на SL-клиент или в другое приложение при помощи WCF-сервиса), сделать там в них изменения (добавить новые, изменить, удалить), вернуть назад и сохранить изменения в базу. Описанный здесь сценарий было очень сложно реализовать в EFv1, теперь это вопрос намного более тривиальный.

Подробнее о фиче:
Self-Tracking Entities in the Entity Framework
Feature CTP Walkthrough: Self Tracking Entities for Entity Framework

7) Deferred loading

В EFv1 в отношении lazy/eager loading было две опции: eager loading, доступный через Include(), и explicit (явный) lazy loading, доступный через метод Load() классов EntitySet и EntityReference. При этом если вам хотелось реализовать неявную поддержку lazy loading, вам приходилось достаточно серьезно извращаться (мы, например, хакали кодогенерацию EF), хотя в LINQ to SQL эта возможность была с самого начала. Теперь же все стало на свои места - все три сценария поддерживаются, причем третий сценарий для отличия от уже существующего lazy loading назвали deferred loading. Зачем - не знаю.

Подробнее о фиче:
Sneak Preview: Deferred Loading in Entity Framework 4.0
A Look at Lazy Loading in EF4

8) Model Defined Functions

MDF - это специальные функции, добавляемые к сущностям, которые описываются на уровне CSDL, то есть концептуальной модели данных. Эти функции могут принимать параметры, выполнять любой eSQL-код внутри себя, и потом возвращать результат. Благодаря такой возможности их можно использовать в eSQL-запросах, а также в LINQ-запросах (если вывести их наверх). В каких случаях они будут полезны в жизни? Сложно сказать, не могу подобрать реальный пример. Разработчики говорят что-то про Reporting Services, Web Services и т.д. - они необходимы там. Поэтому это больше внутренняя фича, которая будет полезна, если вы начнете делать шаги в сторону от стандартных сценариев. Поживем - увидим.

Подробнее о фиче:
Model Defined Functions
Sneak Preview: Model Defined Functions
EF4: Model-Defined Functions Level 1 & 2

Немного больше об истории и причинах их появления:
Update on Computed Properties

9) Foreign Keys support

EFv4 поддерживает новый тип ассоциации, т.н. FK Association. Старый тип ассоциации теперь принято называть Independent Association. FK Association будет полезен в тех случаях, когда вам удобнее работать со связями через первичные ключи, а не с коллекциями и ссылками на реальные объекты - все-таки это иногда намного более производильные операции. При этом надо сказать, что эта фича далась разработчикам очень нелегко, так как она должна поддерживаться не только на уровне EntityObject, но также на уровне proxy-based POCO, snapshot-based POCO, IPOCO и других способов создания модели.

Подробнее о фиче:
Foreign Keys in the Entity Framework

10) SQL Generation Improvements: readability and performance

Здесь все достаточно просто: генерируемый SQL стал более шустрым и более читабельным, сам процесс генерации тоже ускорился.

Подробнее о фиче:
Improvements to the Generated SQL in .NET 4.0 Beta1
Checking for EF to TSQL Query Compilation Changes in VS2010 Beta1

Об остальных фичах более кратко:

Checking out one of the new stored procedure features in EF4
A big step for Stored Procedures in EF4
Pluralization support
The much improved EDM Wizard Pluralization in VS2010
Complex Types in the EDM Designer in EF4 and a look at updating complex types in code
More Designer Improvements - Deleting Entities from the model and from the store schema

Также ADO.NET team выпустил пару статей по "правильному" написанию кода для поддержки Repository, Unit of Work и даже N-Tier applications. Почитать можно, но все же, на мой взгляд, там лучше почитать комментарии и ссылку, которые в них:

Using Repository and Unit of Work patterns with Entity Framework 4.0
Sneak Preview: N-Tier development with Entity Framework 4.0

Ну, а утрамбовать это все стоит отличным подкастом .NET Rocks #451, где происходит интервью с уже упомянутым Daniel Simmons, который более детально рассказывает о реализации некоторых вышеуказанных фич.

Надеюсь, эта информация кому-нибудь поможет быстрее перестроиться на новую версию EF, а может, просто поподробнее взглянуть на него. В конце-концов, правило о том, что продуктами Microsoft стоит пользоваться после выхода SP1, действует и здесь: первая версия была несколько сырой, но зато во второй добавились многие плюшки, которых так не хватало профессиональным разработчикам.

Удачи!

4 comments:

  1. Отличная вводная статья, спасибо!

    ReplyDelete
  2. А обновления ссылочек на статьи будут?
    Отличный сборник важных вещей по EF4

    ReplyDelete
  3. Думаю, что нет. Пост писался больше года назад, когда о EF4 еще мало кто знал. С тех пор о EF4 появилось очень много информации. Все собрать будет сложно, да и нужно ли, когда есть гугл :)

    ReplyDelete