Как определить модель с наследованием «одна таблица на тип» (платформа Entity Framework)
В этом разделе описывается, как вручную создать концептуальную модель с иерархией наследования «одна таблица на тип». В наследовании типа «одна таблица на тип» используется отдельная таблица в базе данных для сопровождения данных, относящихся к ненаследуемым свойствам и ключевым свойствам для каждого типа в иерархии наследования.
![]() |
---|
Рекомендуется определять модель с наследованием «одна таблица на тип» с помощью ADO.NET Entity Data Model Tools.Дополнительные сведения см. в разделе Walkthrough: Mapping Inheritance - Table-per-Type. |
Далее представлены основные действия по определению модели с наследованием «одна таблица на тип» вручную.
Определите в концептуальной модели один набор сущностей, который содержит базовый тип сущности и производные типы. Дополнительные сведения см. в разделе Элемент EntitySet (CSDL).
Определите в концептуальной модели производные типы сущностей с помощью атрибута BaseType и определите в производных типах только ненаследуемые свойства. Дополнительные сведения см. в разделе Элемент EntityType (язык CSDL).
Сопоставьте базовый тип сущности и производные типы в одном элементе EntitySetMapping на языке MSL. Сопоставьте наследуемые свойства со столбцами таблицы там, где нужно. При задании значения атрибута TypeName используйте синтаксис
IsTypeOf
. Дополнительные сведения см. в разделе Элемент EntitySetMapping (язык MSL).
В следующем примере предполагается, что установлен образец базы данных School, а проект вручную настроен для использования Entity Framework . Дополнительные сведения см. в разделах Создание образца базы данных School (краткое руководство по Entity Framework) и Настройка платформы Entity Framework (задачи Entity Framework).
Создание модели хранения
Добавьте в проект следующий 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>
Создание концептуальной модели
Добавьте в проект следующий 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>
Определение сопоставления между концептуальной моделью и моделью хранения
Добавьте в проект следующий 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)