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

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

Bb399232.note(ru-ru,VS.100).gifПримечание
Все фрагменты файла сопоставления, приведенные в этом разделе, созданы при помощи мастера Entity Data Model Wizard.

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

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

Следующий фрагмент XML представляет часть концептуальной модели School (основанной на примере базы данных School). В следующем примере показываются типы сущностей Course и Department, связанные ассоциацией FK_Course_Department; все другие сущности и ассоциации удалены.

<Schema Namespace="SchoolModel" Alias="Self" 
xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation" 
      xmlns="https://schemas.microsoft.com/ado/2008/09/edm">
  <EntityContainer Name="SchoolEntities">
   <EntitySet Name="Courses" EntityType="SchoolModel.Course" />
   <EntitySet Name="Departments" EntityType="SchoolModel.Department" />

  <AssociationSet Name="FK_Course_Department" 
                  Association="SchoolModel.FK_Course_Department">
            <End Role="Department" EntitySet="Departments" />
            <End Role="Course" EntitySet="Courses" />
  </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" />
       <Property Name="Credits" Type="Int32" Nullable="false" />
       <Property Name="DepartmentID" Type="Int32" Nullable="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" />
       <Property Name="Budget" Type="Decimal" Nullable="false" 
                 Precision="19" Scale="4" />
       <Property Name="StartDate" Type="DateTime" Nullable="false" />
       <Property Name="Administrator" Type="Int32" />
       <NavigationProperty Name="Courses" 
                       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="*" />
          <ReferentialConstraint>
            <Principal Role="Department">
              <PropertyRef Name="DepartmentID" />
            </Principal>
            <Dependent Role="Course">
              <PropertyRef Name="DepartmentID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>

      </Schema>

Режим хранения

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

<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/2009/02/edm/ssdl">
  <EntityContainer Name="SchoolModelStoreContainer">
   <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" 
              store:Type="Tables" Schema="dbo" />
   <EntitySet Name="Department" 
              EntityType="SchoolModel.Store.Department" 
              store:Type="Tables" Schema="dbo" />

    <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" />
       <Property Name="Credits" Type="int" Nullable="false" />
       <Property Name="DepartmentID" Type="int" Nullable="false" />
  </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" />
       <Property Name="Budget" Type="money" Nullable="false" />
       <Property Name="StartDate" Type="datetime" Nullable="false" />
       <Property Name="Administrator" Type="int" />
  </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="DepartmentID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>
        
</Schema>

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

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

<Mapping Space="C-S" 
          xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs">
  <EntityContainerMapping 
                 StorageEntityContainer="SchoolModelStoreContainer" 
                 CdmEntityContainer="SchoolEntities">
    <EntitySetMapping Name="Courses">
     <EntityTypeMapping TypeName="SchoolModel.Course">
      <MappingFragment StoreEntitySet="Course">
       <ScalarProperty Name="CourseID" ColumnName="CourseID" />
       <ScalarProperty Name="Title" ColumnName="Title" />
       <ScalarProperty Name="Credits" ColumnName="Credits" />
       <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
      </MappingFragment>
     </EntityTypeMapping>
    </EntitySetMapping>
    <EntitySetMapping Name="Departments">
     <EntityTypeMapping TypeName="SchoolModel.Department">
      <MappingFragment StoreEntitySet="Department">
       <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
       <ScalarProperty Name="Name" ColumnName="Name" />
       <ScalarProperty Name="Budget" ColumnName="Budget" />
       <ScalarProperty Name="StartDate" ColumnName="StartDate" />
       <ScalarProperty Name="Administrator" 
                       ColumnName="Administrator" />
      </MappingFragment>
     </EntityTypeMapping>
    </EntitySetMapping>
   </EntityContainerMapping>
</Mapping>

Обсуждение

В обсуждаемой здесь модели School используется простое взаимно однозначное сопоставление между концептуальной сущностью и таблицей базы данных, однако платформа Entity Framework поддерживает и более сложные сопоставления, например, «одна таблица на иерархию» или «одна таблица на тип». Дополнительные сведения см. в разделах Entity Data Model Tools Scenarios и Определение расширенных моделей данных (задачи платформы Entity Framework).

См. также

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

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

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

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