Как определить модель с несколькими наборами сущностей для типа (платформа Entity Framework)

В данном разделе рассматривается создание концептуальной модели с несколькими наборами сущностей на тип (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

Пример также предполагает, что проект настроен для использования . Дополнительные сведения см. в разделе Настройка платформы Entity Framework (задачи Entity Framework).

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

  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="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
                xmlns="http://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-файле замените элемент Schema в элементе edmx:ConceptualModels на элемент Schema в следующем XML-файле.

    Обратите внимание, что для типа сущности Course определено два набора сущностей.

    <?xml version="1.0" encoding="utf-8" ?>
    <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm"
                  xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration"
                  xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
                  Namespace="MEST" Alias="Self"
                  xmlns:annotation="http://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-файле замените элемент Mapping в элементе edmx:Mappings на элемент Mapping в следующем XML-файле.

    Обратите внимание, что каждый набор сущностей сопоставлен с соответствующей основной базой данных.

    <?xml version="1.0" encoding="utf-8" ?>
    <Mapping Space="C-S"
                 xmlns="http://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