Entity Data Model キーの概念
Entity Data Model (EDM) では、"エンティティ型"、"アソシエーション型"、"プロパティ" という 3 つの主要概念を使用してデータ構造を記述します。 これらは、EDM の実装においてデータ構造を記述する上で最も重要な概念です。
エンティティ型
エンティティ型は、Entity Data Model でデータ構造を記述するために不可欠な構成要素です。 概念モデルでは、エンティティ型は、プロパティから構成され、ビジネス アプリケーションの顧客や注文のように、トップレベル概念の構造を記述します。 コンピューター プログラムのクラス定義がクラスのインスタンスのテンプレートになるように、エンティティ型はエンティティのテンプレートになります。 エンティティは、特定のオブジェクト (特定の顧客や注文など) を表します。 各エンティティに対して、エンティティ セット内のエンティティ キーを一意にする必要があります。 エンティティ セットは、特定のエンティティ型のインスタンスのコレクションです。 エンティティ セット (およびアソシエーション セット) はエンティティ コンテナーに論理的にグループ化されます。
エンティティ型では継承がサポートされており、1 つのエンティティ型を別のエンティティ型から派生させることができます。 詳しくは、「Entity Data Model: 継承」をご覧ください。
アソシエーション型
アソシエーション型 (アソシエーションとも呼ばれます) は、Entity Data Model でリレーションシップを記述するために不可欠な構成要素です。 概念モデルでは、アソシエーションが 2 つのエンティティ型 (Customer や Order など) の間のリレーションシップを表します。 すべてのアソシエーションには、アソシエーションに含まれるエンティティ型を指定する 2 つのアソシエーション End があります。 各アソシエーション End には、アソシエーションのその End に存在できるエンティティ数を示すアソシエーション End の多重度も指定する必要があります。 アソシエーション End の多重度には、1 (1)、ゼロか 1 (0..1)、または多数 (*) の値を指定することができます。 アソシエーションの 1 つの End にあるエンティティには、エンティティ型で公開されている場合、ナビゲーション プロパティまたは外部キーからアクセスできます。 詳しくは、「外部キーのプロパティ」をご覧ください。
アプリケーションでは、アソシエーションのインスタンスが特定のアソシエーション (Customer のインスタンスと Order のインスタンスの間のアソシエーションなど) を表します。 アソシエーション インスタンスは、アソシエーション セットに論理的にグループ化されます。 アソシエーション セット (およびエンティティ セット) はエンティティ コンテナーに論理的にグループ化されます。
プロパティ
エンティティ型には、その構造と特性を定義するプロパティが含まれます。 たとえば、Customer エンティティ型には、CustomerId、Name、Address などのプロパティがあります。
概念モデルのプロパティは、コンピューター プログラムのクラスに定義されるプロパティに似ています。 クラスのプロパティがクラスの構造を定義し、オブジェクトに関する情報を伝達するのと同様に、概念モデルのプロパティはエンティティ型の構造を定義し、エンティティ型のインスタンスに関する情報を伝達します。
プロパティには、プリミティブ データ (文字列、整数、ブール値など) または構造化データ (複合型) を含めることができます。 詳しくは、「Entity Data Model: プリミティブ データ型」をご覧ください。
概念モデルの表現
"概念モデル" は、一部のデータの構造をエンティティおよびリレーションシップとして表現したものです。 概念モデルを表現する 1 つの手段として、ダイアグラムを使用することができます。 下のダイアグラムは、3 つのエンティティ型 (Book
、Publisher
、および Author
) と 2 つのアソシエーション (PublishedBy
および WrittenBy
) の概念モデルを表しています。
しかし、この表現には、モデルに関する詳細を伝える上でいくつかの欠点があります。 たとえば、プロパティ型とエンティティ セットの情報はダイアグラムに示されていません。 ドメイン固有言語 (DSL) を使用すると、概念モデルの詳細情報をさらに明確に伝えることができます。 ADO.NET Entity Framework では、"概念スキーマ定義言語" (CSDL) と呼ばれる XML ベースの DSL を使用して概念モデルを定義します。 以下に、上のダイアグラムに示されている概念モデルの CSDL 定義を示します。
<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="BooksModel" Alias="Self">
<EntityContainer Name="BooksContainer" >
<EntitySet Name="Books" EntityType="BooksModel.Book" />
<EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
<EntitySet Name="Authors" EntityType="BooksModel.Author" />
<AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
<End Role="Book" EntitySet="Books" />
<End Role="Publisher" EntitySet="Publishers" />
</AssociationSet>
<AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
<End Role="Book" EntitySet="Books" />
<End Role="Author" EntitySet="Authors" />
</AssociationSet>
</EntityContainer>
<EntityType Name="Book">
<Key>
<PropertyRef Name="ISBN" />
</Key>
<Property Type="String" Name="ISBN" Nullable="false" />
<Property Type="String" Name="Title" Nullable="false" />
<Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
<NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
FromRole="Book" ToRole="Publisher" />
<NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
FromRole="Book" ToRole="Author" />
</EntityType>
<EntityType Name="Publisher">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Type="Int32" Name="Id" Nullable="false" />
<Property Type="String" Name="Name" Nullable="false" />
<Property Type="String" Name="Address" Nullable="false" />
<NavigationProperty Name="Books" Relationship="BooksModel.PublishedBy"
FromRole="Publisher" ToRole="Book" />
</EntityType>
<EntityType Name="Author">
<Key>
<PropertyRef Name="Name" />
<PropertyRef Name="Address" />
</Key>
<Property Type="String" Name="Name" Nullable="false" />
<Property Type="String" Name="Address" Nullable="false" />
<NavigationProperty Name="Books" Relationship="BooksModel.WrittenBy"
FromRole="Author" ToRole="Book" />
</EntityType>
<Association Name="PublishedBy">
<End Type="BooksModel.Book" Role="Book" Multiplicity="*" />
<End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
</Association>
<Association Name="WrittenBy">
<End Type="BooksModel.Book" Role="Book" Multiplicity="*" />
<End Type="BooksModel.Author" Role="Author" Multiplicity="*" />
</Association>
</Schema>