如何:通过每种类型多个实体集定义模型(实体框架)

本主题描述如何创建每种类型多个实体集 (MEST) 的概念模型。 通过为每种类型定义多个实体集 (MEST),可以在基础数据库中的多个表具有相同结构时简化代码。 当使用的实体类型与其他类型没有关联时,定义一个 MEST 模型很简单。 但是,若要为与其他类型存在关联的实体类型定义一个 MEST 模型,则必须为对象图中的每个类型实现 MEST。 有关更多信息,请参见 MEST - 什么是 MEST 以及 MEST 如何工作?(可能为英文网页)本主题介绍如何为与其他类型没有关联的实体类型定义一个 MEST。

请注意,仅当基础数据库表具有相同结构时才应实现 MEST。

定义 MEST 模型的基本步骤如下:

  1. 使用多个 EntitySet 元素(每个元素具有相同的 EntityType 特性值)来在概念模型中为给定类型定义多个实体集。

  2. 使用映射规范语言 (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

该示例还假定您已经将项目配置为使用。 有关更多信息,请参见配置实体框架(实体框架任务)

创建存储模型

  1. 将下面的 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>
    

创建概念模型

  1. 将下面的 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>
    

定义概念模型与存储模型之间的映射

  1. 将下面的 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