Как определить модель с несколькими наборами сущностей для типа (платформа Entity Framework)
В данном разделе рассматривается создание концептуальной модели с несколькими наборами сущностей на тип (MEST). Определение нескольких наборов сущностей на тип позволяет упростить код в тех случаях, когда несколько таблиц в основной базе данных имеют одну и ту же структуру. При работе с типами сущности, которые не содержат ассоциаций с другими типами, определение модели MEST является простой задачей. Однако для определения модели MEST для типов сущности, которые содержат ассоциации с другими типами, необходимо реализовать модель MEST для каждого типа в графе объектов. Дополнительные сведения см. в документе MEST — определение и описание. В данном разделе приведены сведения, как определить модель MEST для типа сущности, которые не содержат ассоциаций с другими типами.
Обратите внимание, что реализация MEST необходима только в том случае, когда таблицы основной базы данных имеют одинаковую структуру.
Ниже представлены основные этапы определения модели MEST.
Чтобы определить несколько наборов сущностей для данного типа в концептуальной модели, используйте несколько элементов EntitySet (каждый с одинаковым значением для атрибута EntityType).
Сопоставьте на языке MSL каждый набор сущностей с соответствующей таблицей. Дополнительные сведения см. в разделе Элемент EntitySetMapping (язык MSL).
В приведенном ниже примере предполагается, что установлен следующий образец базы данных.
USE [master]
GO
CREATE DATABASE [TestDB]
GO
SET QUOTED_IDENTIFIER OFF;
SET ANSI_NULLS ON;
GO
USE [TestDB]
GO
-- --------------------------------------------------
-- Create Tables
-- --------------------------------------------------
-- Creating table 'GraduateCourses'
CREATE TABLE [dbo].[GraduateCourses] (
[GraduateCourseId] int NOT NULL,
[Title] nvarchar(max) NOT NULL,
[Credits] int NOT NULL
);
GO
-- Creating table 'UnderGraduateCourses'
CREATE TABLE [dbo].[UnderGraduateCourses] (
[UnderGraduateCourseId] int NOT NULL,
[Title] nvarchar(max) NOT NULL,
[Credits] int NOT NULL
);
GO
-- --------------------------------------------------
-- Primary Key Constraints
-- --------------------------------------------------
-- Creating primary key in table 'GraduateCourses'
ALTER TABLE [dbo].[GraduateCourses] WITH NOCHECK
ADD CONSTRAINT [PK_GraduateCourses]
PRIMARY KEY CLUSTERED ([GraduateCourseId] ASC)
ON [PRIMARY]
GO
-- Creating primary key in table 'UnderGraduateCourses'
ALTER TABLE [dbo].[UnderGraduateCourses] WITH NOCHECK
ADD CONSTRAINT [PK_UnderGraduateCourses]
PRIMARY KEY CLUSTERED ([UnderGraduateCourseId] ASC)
ON [PRIMARY]
GO
Пример также предполагает, что проект настроен для использования . Дополнительные сведения см. в разделе Настройка платформы Entity Framework (задачи Entity Framework).
Создание модели хранения
Добавьте следующий XML-файл в проект и присвойте ему имя
MEST.ssdl
.— или —
Добавьте в проект пустой EDMX-файл (
MEST.edmx
) и замените в следующем XML-файле элемент Schema в элементе edmx:StorageModels на элемент Schema. Дополнительные сведения см. в разделах How to: Create a New .edmx File и .edmx File Overview.Обратите внимание, что таблицы в модели хранения имеют одинаковую структуру.
<?xml version="1.0" encoding="utf-8" ?> <Schema Namespace="MEST.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="MESTStoreContainer"> <EntitySet Name="GraduateCourses" EntityType="MEST.Store.GraduateCourses" store:Type="Tables" Schema="dbo" /> <EntitySet Name="UnderGraduateCourses" EntityType="MEST.Store.UnderGraduateCourses" store:Type="Tables" Schema="dbo" /> </EntityContainer> <EntityType Name="GraduateCourses"> <Key> <PropertyRef Name="GraduateCourseId" /> </Key> <Property Name="GraduateCourseId" Type="int" Nullable="false" /> <Property Name="Title" Type="nvarchar(max)" Nullable="false" /> <Property Name="Credits" Type="int" Nullable="false" /> </EntityType> <EntityType Name="UnderGraduateCourses"> <Key> <PropertyRef Name="UnderGraduateCourseId" /> </Key> <Property Name="UnderGraduateCourseId" Type="int" Nullable="false" /> <Property Name="Title" Type="nvarchar(max)" Nullable="false" /> <Property Name="Credits" Type="int" Nullable="false" /> </EntityType> </Schema>
Создание концептуальной модели
Добавьте следующий XML-файл в проект и присвойте ему имя
MEST.csdl
.— или —
В EDMX-файле замените элемент Schema в элементе edmx:ConceptualModels на элемент Schema в следующем XML-файле.
Обратите внимание, что для типа сущности Course определено два набора сущностей.
<?xml version="1.0" encoding="utf-8" ?> <Schema xmlns="https://schemas.microsoft.com/ado/2008/09/edm" xmlns:cg="https://schemas.microsoft.com/ado/2006/04/codegeneration" xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" Namespace="MEST" Alias="Self" xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation"> <EntityContainer Name="MESTContainer" annotation:LazyLoadingEnabled="true"> <EntitySet Name="GraduateCourses" EntityType="MEST.Course" /> <EntitySet Name="UnderGraduateCourses" EntityType="MEST.Course" /> </EntityContainer> <EntityType Name="Course"> <Key> <PropertyRef Name="CourseId" /> </Key> <Property Type="Int32" Name="CourseId" Nullable="false" /> <Property Type="String" Name="Title" Nullable="false" /> <Property Type="Int32" Name="Credits" Nullable="false" /> </EntityType> </Schema>
Определение сопоставления между концептуальной моделью и моделью хранения
Добавьте следующий XML-файл в проект и назовите его
MEST.msl
.— или —
В EDMX-файле замените элемент Mapping в элементе edmx:Mappings на элемент Mapping в следующем XML-файле.
Обратите внимание, что каждый набор сущностей сопоставлен с соответствующей основной базой данных.
<?xml version="1.0" encoding="utf-8" ?> <Mapping Space="C-S" xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs"> <EntityContainerMapping StorageEntityContainer="MESTStoreContainer" CdmEntityContainer="MESTContainer"> <EntitySetMapping Name="GraduateCourses"> <EntityTypeMapping TypeName="IsTypeOf(MEST.Course)"> <MappingFragment StoreEntitySet="GraduateCourses"> <ScalarProperty Name="CourseId" ColumnName="GraduateCourseId" /> <ScalarProperty Name="Title" ColumnName="Title" /> <ScalarProperty Name="Credits" ColumnName="Credits" /> </MappingFragment> </EntityTypeMapping> </EntitySetMapping> <EntitySetMapping Name="UnderGraduateCourses"> <EntityTypeMapping TypeName="IsTypeOf(MEST.Course)"> <MappingFragment StoreEntitySet="UnderGraduateCourses"> <ScalarProperty Name="CourseId" ColumnName="UnderGraduateCourseId" /> <ScalarProperty Name="Title" ColumnName="Title" /> <ScalarProperty Name="Credits" ColumnName="Credits" /> </MappingFragment> </EntityTypeMapping> </EntitySetMapping> </EntityContainerMapping> </Mapping>
См. также
Другие ресурсы
Спецификации языка CSDL, SSDL и MSL
Определение расширенных моделей данных (задачи платформы Entity Framework)
ADO.NET Entity Data Model Tools