Multiple-Entity-Sets-per-Type でモデルを定義する方法 (Entity Framework)

このトピックでは、Multiple-Entity-Sets-per-Type (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) をプロジェクトに追加し、edmx:StorageModels 要素の下の Schema 要素を次の XML ファイルの 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 ファイルで、edmx:ConceptualModels 要素の Schema 要素を次の XML ファイルの Schema 要素に置き換えます。

    2 つのエンティティ セットが 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 ファイルで、edmx:Mappings 要素の Mapping 要素を次の XML ファイルの 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 仕様
高度なデータ モデルの定義 (Entity Framework タスク)
ADO.NET Entity Data Model Tools