вторник, 10 марта 2009 г.

Влюбляемся в Entity Framework: Шаг второй: Архитектура EF

Создание первой модели
Дабы дальнейший разговор был более предметным, создадим нашу первую модель. Предварительно необходимо в Sql Server 2005 заресторить базу данных из бэкапа, расположенного в прикрепленном к этому посту файле. Далее:
  1. Создадим в Visual Studio 2008 новый проект Console Application и назовем его FirstModel.
  2. В Solution Explorer правой кнопкой кликаем по имени проекта -> Add -> New Item -> выбираем ADO.NET Entity Data Model и вводим имя FirstModel -> Add
  3. Выбираем Generate From Database (по умолчанию) -> Next
  4. Заходим в New Connection, где создаем соединение к базе данных First Model. Если Вы выбрали Sql Server Authentication, то после создания строки нужно будет подтвердить хранение логина и пароля в строке соединения, выбрав "Yes, include sensitive data in the connection string". В поле ввода имени строки соединения вводим FirstModel (фактически это не имя строки соединения, а Entity Container Name, но об этом мы подробнее поговорим как-нибудь в следующий раз) -> Next
  5. В появившемся окне необходимо выбрать элементы, которые будут добавлены в модель. Выбираем таблицы Addresses и Persons -> Finish.
Модель сформирована - можем приступать к изучению ее "внутренностей".

Изучаем модель изнутри
После создания модели в проект было добавлено 2 файла: FirstModel.edmx и FirstModel.Designer.cs. Кроме того, Visual Studio открыла ForstModel.edmx EF-дизайнером.

FirstModel.edmx - XML файл, описывающий Entity Data Model (EDM), а также содержащий некоторую вспомогательную информацию для EF-дизайнера.

Я не буду подробно останавливаться на рассмотрении EDM: об этом подробно писал Сергей Розовик. Вкратце, EDM является одной из основных концепций EF и представляет собой совокупность трех элементов: схемы хранилища (Store Schema Definition Language (SSDL) = Storage Schema), концептуальной схемы (Conceptual Schema Definition Language (CSDL) = Conceptual Schema) и спецификации отображения (Mapping Specification Language (MSL) = С-S mapping).

Чтобы ознакомиться с содержимым EDM, закроем вкладку с FirstModel.edmx, щелкнем правой кнопкой по FirstModel.edmx в Solution Explorer -> Open With... -> XML Editor -> OK.
На этапе компиляции EDM поэлементно разбивается на три файла, которые встраиваются в ресурсы сборки. Это поведение можно изменить: например, если Вам необходимо во время выполнения динамически вносить изменения в EDM, файлы можно хранить рядом со сборкой.

Перейдем к рассмотрению файла FirstModel.Designer.cs. Как несложно догадаться из названия, этот файл был сгенерирован EF-дизайнером. Заглянем во внутрь.
Дизайнер любезно сгенерировал для нас три класса: класс FirstModel, являющийся наследником ObjectContext, и две сущности Addresses и Persons, являющиеся наследниками EntityObject.

Кстати, namespace, который мы вводили при создании модели, - это внутренний namespace модели, который используется для полного именования сущностей. Namespace же сгенерированных классов определяется их местонахождением в проекте.

Теперь настало время абстрагироваться от нашего примера и посмотреть, как же он вписывается в общую архитектуру Entity Framework.

Архитектура Entity Framework
Рассмотрим схему, изображающую основные компоненты (и способы взаимодействия с ними) Entity Framework:
Работа EF выглядит примерно следующим образом:
  1. Формируется запрос к EntityClient (при помощи Object Services либо напрямую)
  2. EntityClient при помощи метаданных преобразует Entity SQL или Linq To Entities-запрос в SQL-запрос
  3. SQL-запрос отдается на выполнение ADO.NET провайдеру, указанному в строке соединения (в нашем случае - SqlClient)
  4. После обращения провайдера к СУБД данные в обратном порядке возвращаются.
Детали выполнения запросов мы рассмотрим в следующей статье, сейчас же главная задача - изучить три основных (на мой взгляд) компонента архитектуры EF: Metadata Files (EDM), Entity Client и Object Services.
EDM мы уже рассмотрели в предыдущей главе, так что смело переходим к изучению Entity Client.

EntityClient
EntityClient - самый низкоуровневый способ создания запросов к EDM. EntityClient отличается от Object Services тем, что он не материализует данные в объекты, а просто возвращает данные в виде строк и столбцов посредством EntityDataReader.

При работе с EntityClient невольно вспоминаешь старые-добрые(?) времена, когда основными действующими лицами были SqlClient, OracleClient и т. д. : приходится оперировать аналогичными классами: EntityConnection, EntityCommand, EntityParameter и т. д.

Зачем в Entity Framework нужен столь низкоуровневый подход? На практике самым популярным применением EntityClient является реализация того, что не умеет (или умеет, но плохо) Object Services (например, работа с некоторыми типа хранимых процедур). Об этом мы обязательно подробно поговорим в будущих статьях.

Object Services
Object Services является верхушкой API Entity Framework и располагается в пространстве имен System.Data.Objects. Object Services реализует весь необходимый функционал для удобного создания и взаимодействия с сущностями концептуальной модели. Основным компонентом Object Services является класс ObjectContext, наследником которого в нашей модели является сгенерированный дизайнером класс FirstModel.

Функционал ObjectServices можно разбить на четыре основные группы:
  1. Обработка запросов (Query Processing). Как я уже отмечал, обработку запросов мы отложим до следующей статьи. Однако по рисунку несложно догадаться, что Object Services позволяет делать запросы как при помощи LINQ To Entities, так и при помощи Entity SQL.
  2. Материализация объектов (Object materialization). После получения результатов от ADO.NET-провайдера EntityClient возвращает в Object Services EntityDataReader, после чего Object Services материализует результаты в экземпляры сущностей.
  3. Управление состоянием объектов (Object state management). ObjectContext хранит экземпляр ObjectStateEntry для каждого экземпляра сущности (entity) и взаимосвязи (relationship). В частности, в ObjectStateEntry хранятся оригинальные и текущие значения свойств сущности, что позволяет реализовать отслеживание изменений (change tracking).
  4. Управлением взаимосвязями объектов (Object relationship management). Хотя экземпляры сущностей и "знают", как обратиться к связанным объектам, именно ObjectContext обеспечивает эти взаимосвязи.
Заключение
Надеюсь к этому моменту мне удалось передать в общих чертах суть архитектуры Entity Framework. Понимание того, как и какие компоненты взаимодействуют друг с другом очень важно при решении более сложных задач, до которых мы со временем обязательно доберемся.

Прикрепленный файл

10 комментариев:

Анонимный комментирует...

"Теперь настал момент абстрагироваться..."
звучит странновато. Может стоит заменить на:
"Теперь настало время абстрагироваться..."?

Idsa комментирует...

Да, пожалуй :)
Спасибо. Fixed.

kluben комментирует...

При подключении из VS 2008 SP1 к SQL Server 2005 для генерации модели может появиться ошибка:

"Could not load file or assembly Microsoft.SqlServer.Management.Sdk.Sfc"


Лечится так...

buy viagra комментирует...

В более подробное описание, определяющее конкретную архитектуру, также входят: структурная схема ЭВМ, средства и способы доступа к элементам этой структурной схемы, организация и разрядность интерфейсов ЭВМ, набор и доступность регистров, организация памяти и способы её адресации, набор и формат машинных команд процессора, способы представления и форматы данных, правила обработки прерываний.ag

MOPO3OB комментирует...

"... изучить три основные (на мой взгляд) компонента архитектуры ..."

три основных компонента




Статья понравилась. Спасибо!

Idsa комментирует...

Fixed

Анонимный комментирует...

как неудобно, что кнопка "Следующее" слева, а "Предыдущее" справа) ну совсем не по стандарту)
а за статьи спасибо)

Анонимный комментирует...

" (например, работа с некоторыми типа хранимых процедур). "

имелось в виду "с некоторыми типами"?

Анонимный комментирует...

Здравствуйте! Проверьте ссылку на прикрепленный файл, пожалуйста. При переходе вылезает "Page not found".

Анонимный комментирует...

Похоже автор оставил статьи без присмотра. Жаль что ссылка битая