Опубликован: 04.05.2010 | Доступ: свободный | Студентов: 4032 / 454 | Оценка: 4.64 / 4.44 | Длительность: 41:24:00
Лекция 8:

Проектирование баз данных и работа с ними Веб-приложений. LINQ, ADO.NET Entities, DDD

10.1.3.1.2. Сопоставление объектов и данных

При использовании объектно-ориентированного программирования для взаимодействия с системами хранения данных возникают сложности. Безусловно, организация классов часто напоминает организацию таблиц реляционной базы данных, но такое соответствие не идеально. Несколько нормализованных таблиц часто соответствуют единственному классу, а связи между классами представлены иначе, чем связи между таблицами.

В существующих решениях была предпринята попытка устранить этот разрыв, часто называемый "несоответствием типов данных" (impedance mismatch), путем сопоставления с реляционными таблицами и столбцами только объектно-ориентированных классов и свойств. Вместо данного традиционного подхода в Entity Framework реляционные таблицы, столбцы и ограничения внешнего ключа логических моделей преобразуются в сущности и связи концептуальных моделей. Это позволяет достичь большей гибкости при определении объектов и оптимизации логической модели. С помощью инструментов Entity Data Model формируются расширяемые классы данных, основанные на концептуальной модели. Эти классы являются разделяемыми классами, которые могут быть расширены с помощью дополнительных членов, добавленных разработчиком. Классы, сформированные для определенной концептуальной модели, являются производными от базовых классов, предоставляющих службы объектов для материализации сущностей в виде объектов, а также для отслеживания и сохранения изменений. Разработчики могут использовать эти три класса для работы с сущностями и связями как с объектами, связанными свойствами навигации.

10.1.3.1.3. Компоненты платформы Entity Framework

Следующие функции и компоненты платформы Entity Framework работают совместно для обеспечения сквозной среды программирования.

  • Модель Entity Data Model (EDM) служит центром приложения Entity Framework. Она задает схему проекта, которая используется для построения программируемых классов, используемых кодом приложения.
  • Компонент Object Services позволяет программистам работать с классами CLR, созданными из концептуальной модели. Он также обеспечивает инфраструктурную поддержку для приложения Entity Framework, предоставляя такие службы, как управление состоянием, отслеживание изменений, разрешение идентификаторов, загрузка и переход по связям, распространение изменений объектов в модификации базы данных, а также поддержку запросов для Entity SQL.
  • Компонент LINQ to Entities обеспечивает поддержку LINQ при запросах к сущностям. Компонент LINQ to Entities позволяет разработчикам писать запросы к базе данных на одном из поддерживаемых языков программирования .NET Framework, например Visual Basic или Visual C#.
  • Язык Entity SQL подобен языку SQL и не зависит от типа хранилища. Он предназначен для создания запросов к сложным графам объектов, основанных на модели EDM, а также для управления ими.
  • Поставщик EntityClient расширяет модель поставщика ADO.NET путем доступа к данным в терминах сущностей и связей концептуальной модели. Он выполняет запросы, которые используют язык Entity SQL. Entity SQL предоставляет базовый язык запросов, который позволяет поставщику EntityClient связываться с базой данных.
  • Компонент метаданных ADO.NET управляет метаданными для всей платформы Entity Framework как во время разработки, так и во время выполнения. Все метаданные, связанные с моделями и сопоставлениями, доступны через интерфейсы метаданных, которые не зависят от механизма, используемого для хранения метаданных. Текущий механизм хранения использует файлы, которые основаны на трех диалектах XML: языке CSDL, языке SSDL и языке MSL.
  • Приложение Entity Framework включает изменяющийся набор средств, которые создают сопоставления и разделяемые классы, представляющие сущности концептуальной модели.
  • Приложение Entity Framework включает обновленный поставщик данных SqlClient, который поддерживает канонические деревья команд.

На рис. 10.13 показаны связи различных доступных пользователям интерфейсов программирования в приложении Entity Framework [10, 11]. Стрелка вниз обозначает запрос к источнику данных, а стрелка вверх – возвращаемые данные. Службы объектов создают каноническое дерево команд, которое представляет работу LINQ to Entities или Entity SQL с концептуальной моделью. Поставщик EntityClient преобразует это каноническое дерево команд, основанное на модели EDM, в новое каноническое дерево команд, содержащее эквивалентные операции для источника данных.

Компоненты Entity Framework

Рис. 10.13. Компоненты Entity Framework
10.1.3.1.4. Средства работы с моделью EDM

Наряду со средой выполнения Entity Framework, .NET Framework 3.5 с пакетом обновления 1 включает генератор моделей EDM (EdmGen.exe). Программа командной строки соединяется с источником данных и формирует модель EDM на основе сопоставления типа "один к одному" между сущностями и таблицами. В этой программе используется также файл концептуальной модели (с расширением CSDL) для формирования файла уровня объектов, содержащего классы, которые представляют типы сущностей и контекст ObjectContext.

Visual Studio 2008 включает в себя обширный набор поддерживаемых инструментов для создания и обслуживания модели EDM в приложении Visual Studio. Конструктор Entity Data Model поддерживает создание усовершенствованных сценариев сопоставления (таких как наследование типа "одна таблица на тип" и "одна таблица на иерархию"), а также разделение сущностей, которые сопоставлены с несколькими таблицами.

10.1.3.2. Создание сущностной модели данных

Для примера создания EDM будет использоваться база данных Northwind.

C помощью мастера EDM, который предоставляет список объектов, которые возможно смоделировать (рис. 10.14 ), включим все таблицы в модель, тем самым произведя взаимно-однозначное сопоставление таблиц сущностям [12].

Мастер EDM

Рис. 10.14. Мастер EDM

Источник: Обзор ADO.NET Entity Framework [12]

Помимо создания файлов CSDL, SSDL и MSL для всех таблиц в Northwind, мастер также создаст набор классов, основываясь на CSDL, представляющий модель. Часть этих классов показана на рис. 10.15 в окне Class View.

Мастер EDM отследил связь между таблицами Customers и Orders в базе данных и создал соответствующую ассоциацию в концептуальной модели. Поэтому класс Customers содержит свойство перемещения Orders, позволяющее разработчикам переходить от экземпляра класса Customers к любому из экземпляров класса Orders для него.

Классы

Рис. 10.15. Классы

Источник: Обзор ADO.NET Entity Framework [12]

10.1.3.3. Разбор CSDL

Метаданные, содержащиеся в CSDL-файле, содержат списки сущностей, представленных элементами EntityType, и связей, представленных элементами Association, относящихся к типу AssociationType. Далее показан фрагмент CSDL-файла, определяющий EntityType:

<EntityType Name="Customers" Key="CustomerID">
  <Property Name="CustomerID" Type="String" Nullable="false"
MaxLength="4000" FixedLength="true" />
  <Property Name="CompanyName" Type="String" Nullable="false"
MaxLength="4000" />
  <Property Name="ContactName" Type="String" MaxLength="4000" />
  <Property Name="ContactTitle" Type="String" MaxLength="4000" />
  <Property Name="Address" Type="String" MaxLength="4000" />
  <Property Name="City" Type="String" MaxLength="4000" />
  <Property Name="Region" Type="String" MaxLength="4000" />
  <Property Name="PostalCode" Type="String" MaxLength="4000" />
  <Property Name="Country" Type="String" MaxLength="4000" />
  <Property Name="Phone" Type="String" MaxLength="4000" />
  <Property Name="Fax" Type="String" MaxLength="4000" />
  <NavigationProperty Name="Orders"
Relationship="NorthwindModel.FK_Orders_Customers"
FromRole="Customers" ToRole="Orders" />
</EntityType>

Сущности содержат списки скалярных свойств, определяющих их. Атрибут Key показывает, какие свойства являются ключевыми. Составные ключи выделяются разделением имен свойств пробелами. Сущности также могут содержать специальные свойства, называемые NavigationProperty. Они определяют переходы от одной сущности к другой через ассоциации.

В следующем фрагменте CSDL определятся AssociationType между Customer и относящимися к нему Orders:

<Association Name="FK_Orders_Customers">
  <End Role="Customers" Type=
         "NorthwindModel.Customers"
      Multiplicity="0..1" />
  <End Role="Orders" Type=
         "NorthwindModel.Orders" Multiplicity="*" />
</Association>

Элементы End в AssociationType указывают участвующих в ассоциации. В этом примере сущность Customers ассоциирована с сущностью Orders. Также сущность Customers может быть связана с любым числом сущностей Orders, что определяется атрибутом Multiplicity.

В то время как элементы EntityType и AssociationType определяют типы сущностей области и отношения между ними, элементы EntitySet и AssociationSet определяют их области применения. Все "наборы", которые должны быть сгруппированы вместе, содержатся внутри элемента EntityContainer.

Следующий фрагмент CSDL демонстрирует EntityContainer и часть его содержимого:

<EntityContainer Name="NorthwindEntities">
  <EntitySet Name="Customers"
      EntityType="NorthwindModel.Customers" />
  <EntitySet Name="Orders"
      EntityType="NorthwindModel.Orders" />
  <AssociationSet Name="FK_Orders_Customers"
          Association="NorthwindModel.FK_Orders_Customers">
    <End Role="Customers" EntitySet="Customers" />
    <End Role="Orders" EntitySet="Orders" />
  </AssociationSet>
</EntityContainer>

Этот фрагмент включает наборы EntitySet для типов EntityType Customers и Orders: Здесь же объявляется ассоциация AssociationSet FK_Orders_Customers. Таким образом, этот фрагмент определяет сущности Customers и Orders, а также связь между ними.