Поделиться через


Сопоставление концептуальной модели со схемой хранения

Платформа Entity Framework обеспечивает объектное представление табличных данных, выраженных как типы сущностей. Разработчику приложения понадобится заниматься только программированием по модели объектов, сформированной на основе концептуальной модели, а не держать в уме еще и схему базы данных, и то, как обращаться к объектам базы данных и преобразовать их в объекты программирования. Платформа Entity Framework использует схемы модели и сопоставления, чтобы преобразовать операции создания, чтения, обновления и удаления над сущностями в эквивалентные операции в источнике данных.

NoteПримечание.

Все фрагменты файла сопоставления, приведенные в этом разделе, сформированы при помощи средства Генератор модели EDM (EdmGen.exe).

Концептуальная модель

Концептуальная модель — это схема Entity Data Model (EDM), определяющая сущности и ассоциации в модели EDM. XML-синтаксис, определяющий эту модель, называется языком определения концептуальной схемы (англ. conceptual schema definition language, язык CSDL). У каждого типа сущности, определенного на языке CSDL, есть имя, ключ для уникальной идентификации экземпляров и набор свойств. Назначенные свойствам типы данных задаются либо как простые типы, которые определяют скалярные свойства, либо как сложные типы, которые состоят из одного или нескольких скалярных или сложных свойств. Дополнительные свойства могут также определять допустимость значений NULL или присваивать значение по умолчанию. Ассоциации определяют отношения между сущностями. Более подробно элементы языка и терминология Entity Framework описываются в разделе Терминология платформы Entity Framework.

Следующий XML-фрагмент представляет часть концептуальной модели для модели «EDM» School, которая определяет типы сущностей Course и Department, связанных ассоциацией FK_Course_Department, при этом остальные сущности и ассоциации удалены.

<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="SchoolModel" Alias="Self" 
  xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
  <EntityContainer Name="SchoolEntities">
    <EntitySet Name="Course" EntityType="SchoolModel.Course" />
    <EntitySet Name="Department" EntityType="SchoolModel.Department" />
    ...
    <AssociationSet Name="FK_Course_Department" 
      Association="SchoolModel.FK_Course_Department">
      <End Role="Department" EntitySet="Department" />
      <End Role="Course" EntitySet="Course" />
    </AssociationSet>
    ...
  </EntityContainer>
  <EntityType Name="Course">
    <Key>
      <PropertyRef Name="CourseID" />
    </Key>
    <Property Name="CourseID" Type="Int32" Nullable="false" />
    <Property Name="Title" Type="String" Nullable="false" 
      MaxLength="100" Unicode="true" FixedLength="false" />
    ...
    <NavigationProperty Name="Department" 
      Relationship="SchoolModel.FK_Course_Department" 
      FromRole="Course" ToRole="Department" />
    ...
  </EntityType>
  <EntityType Name="Department">
    <Key>
      <PropertyRef Name="DepartmentID" />
    </Key>
    <Property Name="DepartmentID" Type="Int32" Nullable="false" />
    <Property Name="Name" Type="String" Nullable="false" MaxLength="50" 
      Unicode="true" FixedLength="false" />
    ...
    <NavigationProperty Name="Course" Relationship="SchoolModel.FK_Course_Department" 
      FromRole="Department" ToRole="Course" />
  </EntityType>
  ...
  <Association Name="FK_Course_Department">
    <End Role="Department" Type="SchoolModel.Department" Multiplicity="1" />
    <End Role="Course" Type="SchoolModel.Course" Multiplicity="*" />
  </Association>
  ...
</Schema>

Модель хранения

Отдельная модель данных при помощи языка определения схемы хранилища (англ. store schema definition language, язык SSDL) описывает логическую модель для постоянных данных, которые обычно хранятся в реляционной базе данных. Типы данных свойств, объявленных в файлах на языке SSDL, содержатся в модели хранения. Этот фрагмент модели хранения является примером метаданных хранилища для таблиц Course и Department в базе данных School, связанных внешним ключом FK_Course_Department, при этом остальные сущности удалены.

<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="SchoolModel.Store" Alias="Self" 
  Provider="System.Data.SqlClient" ProviderManifestToken="2005"   xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"   xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
  <EntityContainer Name="dbo">
    <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" 
      store:Type="Tables" /> 
    <EntitySet Name="Department" 
      EntityType="SchoolModel.Store.Department" store:Type="Tables" />
     ...
    <AssociationSet Name="FK_Course_Department" 
      Association="SchoolModel.Store.FK_Course_Department">
      <End Role="Department" EntitySet="Department" />
      <End Role="Course" EntitySet="Course" />
    </AssociationSet>
    ...
  </EntityContainer>
  <EntityType Name="Course">
    <Key>
      <PropertyRef Name="CourseID" />
    </Key>
    <Property Name="CourseID" Type="int" Nullable="false" />
    <Property Name="Title" Type="nvarchar" Nullable="false" 
      MaxLength="100" />
    ...
  </EntityType>
  <EntityType Name="Department">
    <Key>
      <PropertyRef Name="DepartmentID" />
    </Key>
    <Property Name="DepartmentID" Type="int" Nullable="false" />
    <Property Name="Name" Type="nvarchar" Nullable="false" 
      MaxLength="50" />
    ...
  </EntityType>
  ...
  <Association Name="FK_Course_Department">
    <End Role="Department" Type="SchoolModel.Store.Department" 
      Multiplicity="1" />
    <End Role="Course" Type="SchoolModel.Store.Course" Multiplicity="*" />
    <ReferentialConstraint>
      <Principal Role="Department">
        <PropertyRef Name="DepartmentID" />
      </Principal>
      <Dependent Role="Course">
        <PropertyRef Name="CourseID" />
      </Dependent>
    </ReferentialConstraint>
  </Association>
  ...
</Schema>

Спецификация сопоставления

Спецификация сопоставления при помощи языка определения соответствий (англ. mapping specification language, язык MSL) соединяет типы, объявленные в концептуальной модели, с метаданными базы данных, объявленными в модели хранения. В данном фрагменте на языке MSL демонстрируется взаимно-однозначное сопоставление между концептуальной моделью и моделью хранения для сущностей Course и Department в модели School.

<?xml version="1.0" encoding="utf-8"?>
<Mapping Space="C-S" 
  xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
  <EntityContainerMapping StorageEntityContainer="dbo" 
    CdmEntityContainer="SchoolEntities">
    <EntitySetMapping Name="Course">
      <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Course)">
        <MappingFragment StoreEntitySet="Course">
          <ScalarProperty Name="CourseID" ColumnName="CourseID" />
          <ScalarProperty Name="Title" ColumnName="Title" />
          ...
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
    <EntitySetMapping Name="Department">
      <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Department)">
        <MappingFragment StoreEntitySet="Department">
         <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
          <ScalarProperty Name="Name" ColumnName="Name" />
          ...
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
    ...
    <AssociationSetMapping Name="FK_Course_Department" 
      TypeName="SchoolModel.FK_Course_Department" 
      StoreEntitySet="Course">
      <EndProperty Name="Department">
        <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
      </EndProperty>
      <EndProperty Name="Course">
        <ScalarProperty Name="CourseID" ColumnName="CourseID" />
      </EndProperty>
      <Condition ColumnName="DepartmentID" IsNull="false" />
    </AssociationSetMapping>
    ...
  </cs:EntityContainerMapping>
</Mapping>

Обсуждение

В обсуждаемой здесь модели School используется простое взаимно-однозначное сопоставление между концептуальной сущностью и таблицей базы данных, однако платформа Entity Framework поддерживает и более сложные сопоставления. Например, в реляционной базе данных для хранения данных, связанных с каждым сотрудником, могут использоваться несколько таблиц. В одной таблице может содержаться контактная информация по всем людям, а в отдельной связанной таблице может содержаться контактная информация, относящаяся только к сотрудникам. Платформа Entity Framework позволяет разработчикам определять сущности при помощи иерархий наследования, а также сопоставлять одну сущность с данными, хранящимися в нескольких таблицах базы данных, при этом обеспечивается полная поддержка обновления, вставки и удаления данных. Дополнительные сведения см. в разделе Моделирование данных на платформе Entity Framework.

См. также

Основные понятия

Терминология платформы Entity Framework

Другие ресурсы

Приступая к работе (Entity Framework)
Спецификации модели EDM
Определение расширенных моделей данных (задачи платформы Entity Framework)
Спецификация схем и сопоставлений (платформа Entity Framework)