Создание первой модели
Дабы дальнейший разговор был более предметным, создадим нашу первую модель. Предварительно необходимо в Sql Server 2005 заресторить базу данных из бэкапа, расположенного в прикрепленном к этому посту файле. Далее:- Создадим в Visual Studio 2008 новый проект Console Application и назовем его FirstModel.
- В Solution Explorer правой кнопкой кликаем по имени проекта -> Add -> New Item -> выбираем ADO.NET Entity Data Model и вводим имя FirstModel -> Add
- Выбираем Generate From Database (по умолчанию) -> Next
- Заходим в New Connection, где создаем соединение к базе данных First Model. Если Вы выбрали Sql Server Authentication, то после создания строки нужно будет подтвердить хранение логина и пароля в строке соединения, выбрав "Yes, include sensitive data in the connection string". В поле ввода имени строки соединения вводим FirstModel (фактически это не имя строки соединения, а Entity Container Name, но об этом мы подробнее поговорим как-нибудь в следующий раз) -> Next
- В появившемся окне необходимо выбрать элементы, которые будут добавлены в модель. Выбираем таблицы 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 выглядит примерно следующим образом:
EDM мы уже рассмотрели в предыдущей главе, так что смело переходим к изучению Entity Client.
Работа EF выглядит примерно следующим образом:
- Формируется запрос к EntityClient (при помощи Object Services либо напрямую)
- EntityClient при помощи метаданных преобразует Entity SQL или Linq To Entities-запрос в SQL-запрос
- SQL-запрос отдается на выполнение ADO.NET провайдеру, указанному в строке соединения (в нашем случае - SqlClient)
- После обращения провайдера к СУБД данные в обратном порядке возвращаются.
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 можно разбить на четыре основные группы:
- Обработка запросов (Query Processing). Как я уже отмечал, обработку запросов мы отложим до следующей статьи. Однако по рисунку несложно догадаться, что Object Services позволяет делать запросы как при помощи LINQ To Entities, так и при помощи Entity SQL.
- Материализация объектов (Object materialization). После получения результатов от ADO.NET-провайдера EntityClient возвращает в Object Services EntityDataReader, после чего Object Services материализует результаты в экземпляры сущностей.
- Управление состоянием объектов (Object state management). ObjectContext хранит экземпляр ObjectStateEntry для каждого экземпляра сущности (entity) и взаимосвязи (relationship). В частности, в ObjectStateEntry хранятся оригинальные и текущие значения свойств сущности, что позволяет реализовать отслеживание изменений (change tracking).
- Управлением взаимосвязями объектов (Object relationship management). Хотя экземпляры сущностей и "знают", как обратиться к связанным объектам, именно ObjectContext обеспечивает эти взаимосвязи.
Заключение
Прикрепленный файл
Надеюсь к этому моменту мне удалось передать в общих чертах суть архитектуры Entity Framework. Понимание того, как и какие компоненты взаимодействуют друг с другом очень важно при решении более сложных задач, до которых мы со временем обязательно доберемся.
10 комментариев:
"Теперь настал момент абстрагироваться..."
звучит странновато. Может стоит заменить на:
"Теперь настало время абстрагироваться..."?
Да, пожалуй :)
Спасибо. Fixed.
При подключении из VS 2008 SP1 к SQL Server 2005 для генерации модели может появиться ошибка:
"Could not load file or assembly Microsoft.SqlServer.Management.Sdk.Sfc"
Лечится так...
В более подробное описание, определяющее конкретную архитектуру, также входят: структурная схема ЭВМ, средства и способы доступа к элементам этой структурной схемы, организация и разрядность интерфейсов ЭВМ, набор и доступность регистров, организация памяти и способы её адресации, набор и формат машинных команд процессора, способы представления и форматы данных, правила обработки прерываний.ag
"... изучить три основные (на мой взгляд) компонента архитектуры ..."
три основных компонента
Статья понравилась. Спасибо!
Fixed
как неудобно, что кнопка "Следующее" слева, а "Предыдущее" справа) ну совсем не по стандарту)
а за статьи спасибо)
" (например, работа с некоторыми типа хранимых процедур). "
имелось в виду "с некоторыми типами"?
Здравствуйте! Проверьте ссылку на прикрепленный файл, пожалуйста. При переходе вылезает "Page not found".
Похоже автор оставил статьи без присмотра. Жаль что ссылка битая
Отправить комментарий