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

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

Bb399232.note(ja-jp,VS.100).gif注 :
このセクションに示すマッピング ファイルのフラグメントはすべて、Entity Data Model Wizard によって生成されています。

概念モデル

アプリケーションの概念モデルは、エンティティとリレーションシップを概念スキーマ定義言語 (CSDL) で表現します。これは、Entity Data Model を実装したものです。 CSDL は XML ベースの言語です。 CSDL で定義される各エンティティ型には、名前、インスタンスを一意に識別するためのキー、および一連のプロパティがあります。 プロパティに割り当てられているデータ型は、スカラー プロパティの単純型か、1 つまたは複数のスカラー プロパティまたは複合プロパティから成る複合型として指定されます。 XML 属性も、NULL 値許容の指定や既定値の割り当てを行うことがあります。 アソシエーションは、エンティティ間のリレーションシップを定義します。 Entity Framework 言語の要素と用語については、「Entity Framework の用語」で詳細に説明されています。

次の XML フラグメントは、School 概念モデル (School サンプル データベースに基づく) の一部です。 この例は、Course エンティティ型と Department エンティティ型を示したものです。これらは、FK_Course_Department アソシエーションによって関連付けられます。他のエンティティと関連は除去されています。

<Schema Namespace="SchoolModel" Alias="Self" 
xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation" 
      xmlns="https://schemas.microsoft.com/ado/2008/09/edm">
  <EntityContainer Name="SchoolEntities">
   <EntitySet Name="Courses" EntityType="SchoolModel.Course" />
   <EntitySet Name="Departments" EntityType="SchoolModel.Department" />

  <AssociationSet Name="FK_Course_Department" 
                  Association="SchoolModel.FK_Course_Department">
            <End Role="Department" EntitySet="Departments" />
            <End Role="Course" EntitySet="Courses" />
  </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" />
       <Property Name="Credits" Type="Int32" Nullable="false" />
       <Property Name="DepartmentID" Type="Int32" Nullable="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" />
       <Property Name="Budget" Type="Decimal" Nullable="false" 
                 Precision="19" Scale="4" />
       <Property Name="StartDate" Type="DateTime" Nullable="false" />
       <Property Name="Administrator" Type="Int32" />
       <NavigationProperty Name="Courses" 
                       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="*" />
          <ReferentialConstraint>
            <Principal Role="Department">
              <PropertyRef Name="DepartmentID" />
            </Principal>
            <Dependent Role="Course">
              <PropertyRef Name="DepartmentID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>

      </Schema>

ストレージ モデル

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

<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/2009/02/edm/ssdl">
  <EntityContainer Name="SchoolModelStoreContainer">
   <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" 
              store:Type="Tables" Schema="dbo" />
   <EntitySet Name="Department" 
              EntityType="SchoolModel.Store.Department" 
              store:Type="Tables" Schema="dbo" />

    <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" />
       <Property Name="Credits" Type="int" Nullable="false" />
       <Property Name="DepartmentID" Type="int" Nullable="false" />
  </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" />
       <Property Name="Budget" Type="money" Nullable="false" />
       <Property Name="StartDate" Type="datetime" Nullable="false" />
       <Property Name="Administrator" Type="int" />
  </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="DepartmentID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>
        
</Schema>

マッピング スキーマ

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

<Mapping Space="C-S" 
          xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs">
  <EntityContainerMapping 
                 StorageEntityContainer="SchoolModelStoreContainer" 
                 CdmEntityContainer="SchoolEntities">
    <EntitySetMapping Name="Courses">
     <EntityTypeMapping TypeName="SchoolModel.Course">
      <MappingFragment StoreEntitySet="Course">
       <ScalarProperty Name="CourseID" ColumnName="CourseID" />
       <ScalarProperty Name="Title" ColumnName="Title" />
       <ScalarProperty Name="Credits" ColumnName="Credits" />
       <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
      </MappingFragment>
     </EntityTypeMapping>
    </EntitySetMapping>
    <EntitySetMapping Name="Departments">
     <EntityTypeMapping TypeName="SchoolModel.Department">
      <MappingFragment StoreEntitySet="Department">
       <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
       <ScalarProperty Name="Name" ColumnName="Name" />
       <ScalarProperty Name="Budget" ColumnName="Budget" />
       <ScalarProperty Name="StartDate" ColumnName="StartDate" />
       <ScalarProperty Name="Administrator" 
                       ColumnName="Administrator" />
      </MappingFragment>
     </EntityTypeMapping>
    </EntitySetMapping>
   </EntityContainerMapping>
</Mapping>

説明

ここで説明する School モデルは、概念エンティティとデータベース テーブルとの間の一対一の単純なマッピングを使用していますが、Entity Framework ではさらに複雑なマッピングもサポートされています。たとえば、Table-Per-Hierarchy マッピングや Table-Per-Type マッピングなどです。 詳細については、「Entity Data Model Tools Scenarios」および「高度なデータ モデルの定義 (Entity Framework タスク)」を参照してください。

参照

概念

Entity Framework の用語

その他のリソース

はじめに (Entity Framework)
高度なデータ モデルの定義 (Entity Framework タスク)
CSDL、SSDL、および MSL 仕様