Entity Data Model (EDM) では、エンティティ型、関連付け型、およびプロパティという 3 つの主要な概念を使用してデータの構造を記述します。 これらは、EDM の実装におけるデータの構造を記述する上で最も重要な概念です。
エンティティの種類
エンティティ型は、エンティティ データ モデルを使用してデータの構造を記述するための基本的な構成要素です。 概念モデルでは、エンティティ型は プロパティ から構築され、ビジネス アプリケーションの顧客や注文などの最上位の概念の構造を記述します。 コンピューター プログラムのクラス定義がクラスのインスタンスのテンプレートであるのと同じように、エンティティ型はエンティティのテンプレートです。 エンティティは、特定のオブジェクト (特定の顧客や注文など) を表します。 各エンティティには、エンティティ セット内に一意のエンティティ キーが必要です。 エンティティ セットは、特定のエンティティ型のインスタンスのコレクションです。 エンティティ セット (および アソシエーション セット) は、 エンティティ コンテナーに論理的にグループ化されます。
継承はエンティティ型でサポートされています。つまり、あるエンティティ型を別のエンティティ型から派生させることができます。 詳細については、「 エンティティ データ モデル: 継承」を参照してください。
関連付けの種類
アソシエーション型 (アソシエーションとも呼ばれます) は、Entity Data Model のリレーションシップを記述するための基本的な構成要素です。 概念モデルでは、関連付けは 2 つのエンティティ型 (Customer や Order など) 間のリレーションシップを表します。 すべての関連付けには、 関連付けに 関連するエンティティ型を指定する 2 つの関連付け終了があります。 また、各アソシエーション エンドは、 アソシエーションの最後 に存在できるエンティティの数を示すアソシエーション エンドの多重度も指定します。 アソシエーションエンドの多重度には、1 (1)、0 または 1 (0..1)、もしくは多数 (*) の値を指定できます。 関連付けの一方の端にあるエンティティは、 ナビゲーション プロパティを介してアクセスすることも、エンティティ型で公開されている場合は外部キーを介してアクセスすることもできます。 詳細については、「 外部キー プロパティ」を参照してください。
アプリケーションでは、関連付けのインスタンスは、特定の関連付け (Customer のインスタンスと Order のインスタンスの間の関連付けなど) を表します。 アソシエーション インスタンスは、 アソシエーション セットに論理的にグループ化されます。 アソシエーション セット (および エンティティ セット) は、 エンティティ コンテナーに論理的にグループ化されます。
プロパティ
エンティティ型には、 その構造と特性を定義する プロパティ が含まれています。 たとえば、Customer エンティティ型には、CustomerId、Name、Address などのプロパティが含まれる場合があります。
概念モデルのプロパティは、コンピューター プログラムのクラスで定義されているプロパティに似ています。 クラスのプロパティがクラスの形状を定義し、オブジェクトに関する情報を伝達するのと同じ方法で、概念モデルのプロパティはエンティティ型の形状を定義し、エンティティ型インスタンスに関する情報を伝達します。
プロパティには、プリミティブ データ (文字列、整数、ブール値など) または構造化データ (複合型など) を含めることができます。 詳細については、「 エンティティ データ モデル: プリミティブ データ型」を参照してください。
概念モデルの表現
概念モデルは、一部のデータの構造をエンティティとリレーションシップとして具体的に表現したものです。 概念モデルを表す 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>