如何:通过每种类型多个实体集定义模型(实体框架)
本主题描述如何创建每种类型多个实体集 (MEST) 的概念模型。 通过为每种类型定义多个实体集 (MEST),可以在基础数据库中的多个表具有相同结构时简化代码。 当使用的实体类型与其他类型没有关联时,定义一个 MEST 模型很简单。 但是,若要为与其他类型存在关联的实体类型定义一个 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
该示例还假定您已经将项目配置为使用。 有关更多信息,请参见配置实体框架(实体框架任务)。
创建存储模型
将下面的 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 文件中,用下面的 XML 文件中的 Schema 元素替换 edmx:ConceptualModels 元素中的 Schema 元素。
请注意,已为 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 文件中,用下面的 XML 文件中的 Mapping 元素替换 edmx:Mappings 元素中的 Mapping 元素。
请注意,每个实体集分别映射到适当的基础数据库。
<?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 规范
定义高级数据模型(实体框架任务)
ADO.NET Entity Data Model Tools