Как определить модель с наследованием «одна таблица на тип» (платформа Entity Framework)

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

Bb738685.note(ru-ru,VS.100).gifПримечание
Рекомендуется определять модель с наследованием «одна таблица на тип» с помощью ADO.NET Entity Data Model Tools.Дополнительные сведения см. в разделе Walkthrough: Mapping Inheritance - Table-per-Type.

Далее представлены основные действия по определению модели с наследованием «одна таблица на тип» вручную.

  1. Определите в концептуальной модели один набор сущностей, который содержит базовый тип сущности и производные типы. Дополнительные сведения см. в разделе Элемент EntitySet (CSDL).

  2. Определите в концептуальной модели производные типы сущностей с помощью атрибута BaseType и определите в производных типах только ненаследуемые свойства. Дополнительные сведения см. в разделе Элемент EntityType (язык CSDL).

  3. Сопоставьте базовый тип сущности и производные типы в одном элементе EntitySetMapping на языке MSL. Сопоставьте наследуемые свойства со столбцами таблицы там, где нужно. При задании значения атрибута TypeName используйте синтаксис IsTypeOf. Дополнительные сведения см. в разделе Элемент EntitySetMapping (язык MSL).

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

Создание модели хранения

  1. Добавьте в проект следующий XML-файл и задайте для него имя School.ssdl.

    <?xml version="1.0" encoding="utf-8" ?>
    <Schema Namespace="SchoolModel.Store" Alias="Self" Provider="System.Data.SqlClient"
                  ProviderManifestToken="2008"
                  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="OnlineCourse" EntityType="SchoolModel.Store.OnlineCourse"
                   store:Type="Tables" Schema="dbo" />
        <EntitySet Name="OnsiteCourse" EntityType="SchoolModel.Store.OnsiteCourse"
                   store:Type="Tables" Schema="dbo" />
      </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="OnlineCourse">
        <Key>
          <PropertyRef Name="CourseID" />
        </Key>
        <Property Name="CourseID" Type="int" Nullable="false" />
        <Property Name="URL" Type="nvarchar" Nullable="false" MaxLength="100" />
      </EntityType>
      <EntityType Name="OnsiteCourse">
        <Key>
          <PropertyRef Name="CourseID" />
        </Key>
        <Property Name="CourseID" Type="int" Nullable="false" />
        <Property Name="Location" Type="nvarchar" Nullable="false" MaxLength="50" />
        <Property Name="Days" Type="nvarchar" Nullable="false" MaxLength="50" />
        <Property Name="Time" Type="smalldatetime" Nullable="false" />
      </EntityType>
    </Schema>
    

Создание концептуальной модели

  1. Добавьте в проект следующий XML-файл и задайте для него имя School.csdl. Обратите внимание на следующие моменты.

    • Один набор сущностей Courses определяется для трех типов сущностей: Course, OnlineCourse и OnsiteCourse.

    • Типы сущности OnlineCourse и OnsiteCourse являются производными. На это указывает атрибут BaseType в их определении.

    • Для типов сущности OnlineCourse и OnsiteCourse определяются только ненаследуемые свойства.

    <?xml version="1.0" encoding="utf-8" ?>
    <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" annotation:LazyLoadingEnabled="true">
        <EntitySet Name="Courses" EntityType="SchoolModel.Course" />
      </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" />
      </EntityType>
      <EntityType Name="OnlineCourse" BaseType="SchoolModel.Course">
        <Property Name="URL" Type="String" Nullable="false"
                  MaxLength="100" Unicode="true" FixedLength="false" />
      </EntityType>
      <EntityType Name="OnsiteCourse" BaseType="SchoolModel.Course">
        <Property Name="Location" Type="String" Nullable="false"
                  MaxLength="50" Unicode="true" FixedLength="false" />
        <Property Name="Days" Type="String" Nullable="false"
                  MaxLength="50" Unicode="true" FixedLength="false" />
        <Property Name="Time" Type="DateTime" Nullable="false" />
      </EntityType>
    </Schema>
    

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

  1. Добавьте в проект следующий XML-файл и задайте для него имя School.msl. Обратите внимание на следующие моменты.

    • Сопоставление для типов сущности Course, OnlineCourse и OnsiteCourse определяются в одном элементе EntitySetMapping.

    • Наследуемые свойства CourseID для OnlineCourse и OnsiteCourse сопоставляются с соответствующими столбцами в базовых таблицах базы данных.

    • Для каждого сопоставления с помощью синтаксиса IsTypeOf указывается сопоставляемый тип сущности.

    <?xml version="1.0" encoding="utf-8" ?>
    <Mapping Space="C-S" xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs">
      <EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer"
                              CdmEntityContainer="SchoolEntities">
        <EntitySetMapping Name="Courses">
          <EntityTypeMapping TypeName="IsTypeOf(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>
          <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.OnlineCourse)">
            <MappingFragment StoreEntitySet="OnlineCourse">
              <ScalarProperty Name="CourseID" ColumnName="CourseID" />
              <ScalarProperty Name="URL" ColumnName="URL" />
            </MappingFragment>
          </EntityTypeMapping>
          <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.OnsiteCourse)">
            <MappingFragment StoreEntitySet="OnsiteCourse">
              <ScalarProperty Name="CourseID" ColumnName="CourseID" />
              <ScalarProperty Name="Location" ColumnName="Location" />
              <ScalarProperty Name="Days" ColumnName="Days" />
              <ScalarProperty Name="Time" ColumnName="Time" />
            </MappingFragment>
          </EntityTypeMapping>
        </EntitySetMapping>
      </EntityContainerMapping>
    </Mapping>
    

См. также

Задачи

Как определить модель с наследованием типа «одна таблица на иерархию» (платформа Entity Framework)

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

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