次の方法で共有


概念モデルからストレージ スキーマへのマッピング

エンティティ フレームワーク は、表形式のデータをオブジェクト中心に表示し、エンティティ型として表します。アプリケーション開発者は、データベース スキーマについて考えたり、データベース オブジェクトにアクセスしてプログラミング オブジェクトに変換する方法について考えたりしなくても、概念モデルから生成されるオブジェクト モデルに対するプログラミングについて考慮するだけで済みます。エンティティ フレームワーク はモデル スキーマとマッピングを使用して、エンティティに対する作成、読み取り、更新、削除などの操作を、データ ソースでの同等の操作に変換します。

[!メモ]

このセクションに示すマッピング ファイルのフラグメントはすべて EDM ジェネレータ (EdmGen.exe) ツールによって生成されています。

概念モデル

概念モデルとは、EDM でエンティティとアソシエーションを定義する エンティティ データ モデル (EDM) スキーマです。このモデルを定義する XML 構文は、概念スキーマ定義言語 (CSDL) と呼ばれています。CSDL で定義される各エンティティ型には、名前、インスタンスを一意に識別するためのキー、および一連のプロパティがあります。プロパティに割り当てられているデータ型は、スカラ プロパティの単純型か、1 つまたは複数のスカラ プロパティまたは複合プロパティから成る複合型として指定されます。プロパティを追加して、NULL 値許容の指定や既定値の割り当てを行うこともできます。アソシエーションはエンティティ間の関係を定義します。エンティティ フレームワーク 言語の要素と用語の詳細については、「Entity Framework の用語」を参照してください。

次の XML フラグメントは、FK_Course_Department アソシエーションで関連付けられている Course および Department エンティティ型を定義する School EDM の概念モデルの一部です。他のエンティティとアソシエーションは除去されています。

<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="SchoolModel" Alias="Self" 
  xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
  <EntityContainer Name="SchoolEntities">
    <EntitySet Name="Course" EntityType="SchoolModel.Course" />
    <EntitySet Name="Department" EntityType="SchoolModel.Department" />
    ...
    <AssociationSet Name="FK_Course_Department" 
      Association="SchoolModel.FK_Course_Department">
      <End Role="Department" EntitySet="Department" />
      <End Role="Course" EntitySet="Course" />
    </AssociationSet>
    ...
  </EntityContainer>
  <EntityType Name="Course">
    <Key>
      <PropertyRef Name="CourseID" />
    </Key>
    <Property Name="CourseID" Type="Int32" Nullable="false" />
    <Property Name="Title" Type="String" Nullable="false" 
      MaxLength="100" Unicode="true" FixedLength="false" />
    ...
    <NavigationProperty Name="Department" 
      Relationship="SchoolModel.FK_Course_Department" 
      FromRole="Course" ToRole="Department" />
    ...
  </EntityType>
  <EntityType Name="Department">
    <Key>
      <PropertyRef Name="DepartmentID" />
    </Key>
    <Property Name="DepartmentID" Type="Int32" Nullable="false" />
    <Property Name="Name" Type="String" Nullable="false" MaxLength="50" 
      Unicode="true" FixedLength="false" />
    ...
    <NavigationProperty Name="Course" Relationship="SchoolModel.FK_Course_Department" 
      FromRole="Department" ToRole="Course" />
  </EntityType>
  ...
  <Association Name="FK_Course_Department">
    <End Role="Department" Type="SchoolModel.Department" Multiplicity="1" />
    <End Role="Course" Type="SchoolModel.Course" Multiplicity="*" />
  </Association>
  ...
</Schema>

ストレージ モデル

別のデータ モデルでは、ストア スキーマ定義言語 (SSDL) を使用して、通常はリレーショナル データベースに格納される永続データの論理モデルを記述します。SSDL ファイルで宣言されたプロパティのデータ型は、ストレージ モデルのデータ型になります。このストレージ モデル フラグメントは、FK_Course_Department 外部キーで関連付けられている School データベース内の Course および Department テーブルのストレージ メタデータの例を示しています。他のエンティティは除去されています。

<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="SchoolModel.Store" Alias="Self" 
  Provider="System.Data.SqlClient" ProviderManifestToken="2005"   xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"   xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
  <EntityContainer Name="dbo">
    <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" 
      store:Type="Tables" /> 
    <EntitySet Name="Department" 
      EntityType="SchoolModel.Store.Department" store:Type="Tables" />
     ...
    <AssociationSet Name="FK_Course_Department" 
      Association="SchoolModel.Store.FK_Course_Department">
      <End Role="Department" EntitySet="Department" />
      <End Role="Course" EntitySet="Course" />
    </AssociationSet>
    ...
  </EntityContainer>
  <EntityType Name="Course">
    <Key>
      <PropertyRef Name="CourseID" />
    </Key>
    <Property Name="CourseID" Type="int" Nullable="false" />
    <Property Name="Title" Type="nvarchar" Nullable="false" 
      MaxLength="100" />
    ...
  </EntityType>
  <EntityType Name="Department">
    <Key>
      <PropertyRef Name="DepartmentID" />
    </Key>
    <Property Name="DepartmentID" Type="int" Nullable="false" />
    <Property Name="Name" Type="nvarchar" Nullable="false" 
      MaxLength="50" />
    ...
  </EntityType>
  ...
  <Association Name="FK_Course_Department">
    <End Role="Department" Type="SchoolModel.Store.Department" 
      Multiplicity="1" />
    <End Role="Course" Type="SchoolModel.Store.Course" Multiplicity="*" />
    <ReferentialConstraint>
      <Principal Role="Department">
        <PropertyRef Name="DepartmentID" />
      </Principal>
      <Dependent Role="Course">
        <PropertyRef Name="CourseID" />
      </Dependent>
    </ReferentialConstraint>
  </Association>
  ...
</Schema>

マッピング スキーマ

マッピング スキーマはマッピング スキーマ言語 (MSL) を使用して、概念モデルで宣言した型を、ストレージ モデルで宣言したデータベース メタデータに接続します。この MSL フラグメントは、School モデルの Course および Department エンティティの概念モデルとストレージ モデル間の一対一のマッピングを示しています。

<?xml version="1.0" encoding="utf-8"?>
<Mapping Space="C-S" 
  xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
  <EntityContainerMapping StorageEntityContainer="dbo" 
    CdmEntityContainer="SchoolEntities">
    <EntitySetMapping Name="Course">
      <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Course)">
        <MappingFragment StoreEntitySet="Course">
          <ScalarProperty Name="CourseID" ColumnName="CourseID" />
          <ScalarProperty Name="Title" ColumnName="Title" />
          ...
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
    <EntitySetMapping Name="Department">
      <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Department)">
        <MappingFragment StoreEntitySet="Department">
         <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
          <ScalarProperty Name="Name" ColumnName="Name" />
          ...
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
    ...
    <AssociationSetMapping Name="FK_Course_Department" 
      TypeName="SchoolModel.FK_Course_Department" 
      StoreEntitySet="Course">
      <EndProperty Name="Department">
        <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
      </EndProperty>
      <EndProperty Name="Course">
        <ScalarProperty Name="CourseID" ColumnName="CourseID" />
      </EndProperty>
      <Condition ColumnName="DepartmentID" IsNull="false" />
    </AssociationSetMapping>
    ...
  </cs:EntityContainerMapping>
</Mapping>

説明

ここで説明する School モデルは、概念エンティティとデータベース テーブル間の一対一の単純なマッピングを使用していますが、エンティティ フレームワーク ではさらに複雑なマッピングもサポートされています。たとえば、リレーショナル データベースでは、各従業員に関連付けられているデータの格納に複数のテーブルを使用する場合があります。1 つのテーブルに全員の連絡先情報を格納し、別の関連テーブルには従業員にだけ関連する情報を格納するような場合です。エンティティ フレームワーク を使用すると、開発者は継承階層を使用してエンティティを定義したり、データベース内の複数のテーブルのデータに 1 つのエンティティをマッピングしたりできます。データの更新、挿入、および削除も完全にサポートされています。詳細については、「Entity Framework のデータ モデリング」を参照してください。

参照

概念

Entity Framework の用語

その他のリソース

はじめに (Entity Framework)
EDM 仕様
高度なデータ モデルの定義 (Entity Framework タスク)
スキーマおよびマッピング スキーマ (Entity Framework)