エンティティ セット (EDM)
エンティティ データ モデル (EDM) で、EntitySet は、1 つの型のエンティティの論理コンテナです。同様に、AssociationSet は、同じ型のアソシエーションのコンテナです。スキーマに定義されているエンティティ セットおよびアソシエーション セットは、アプリケーションのデータが格納されるデータベース内のテーブルにマップされます。エンティティ セットおよびアソシエーション セットは、アプリケーション コードによって使用されるプログラミング オブジェクト モデルのクラスの基礎を構成します。
エンティティ セットおよびアソシエーション セットが、エンティティとアソシエーションのスコープを定義するものであるのに対し、エンティティ コンテナは、エンティティとアソシエーションを保持するストレージ コンテナを定義します。SimpleType セットは存在しません。これらの型は、エンティティのプロパティに割り当てられた値としてインスタンス化されます。
EntityType の EntitySet には、EntityType またはそのいずれかのサブタイプのインスタンスが格納されます。同じ EntityType を使用して、複数の EntitySet を定義できます。EntityType の 1 つのインスタンスは、1 つの EntitySet にのみ所属できます。
EntitySet 内のエンティティ インスタンスは、次の 3 つの条件を満たしている必要があります。
エンティティ インスタンスの型が、EntitySet の EntityType か、EntityType のサブタイプであること。
各エンティティ インスタンスの Key 値によって、EntitySet 内の対応するインスタンスを一意に識別できること。
同時に複数の EntitySet に属していないこと。
次の概念スキーマ定義言語 (CSDL) 構文では、CustomerSet
という名前の EntitySet を宣言しています。この EntitySet には、エンティティ CustomerType
のインスタンスが含まれます。
<EntitySet Name="CustomerSet" EntityType="CustomerType"/>
次のスキーマでは、2 つの EntityType 宣言によって、Product
と Supplier
のエンティティ型が定義されています。Product
エンティティと Supplier
エンティティに基づくエンティティ セットには、それぞれの複数形にちなんで Products
と Suppliers
という名前が付けられています。これらのエンティティ セットは、EntityContainer の定義に追加されています。
<?xml version="1.0" encoding="utf-8"?>
<Schema xmlns:cg="https://schemas.microsoft.com/ado/2006/04/codegeneration"
xmlns:edm="https://schemas.microsoft.com/ado/2006/04/edm"
xmlns="https://schemas.microsoft.com/ado/2006/04/edm"
Namespace="MyCompany.LOBSchema" Alias="Self">
<EntityType Name="Product">
<Key>
<PropertyRef Name="ProductID" />
</Key>
<Property Name="ProductID" Type="Int32" Nullable="false" />
<Property Name="ProductName" Type="String" Nullable="false" />
<Property Name="UnitPrice" Type="Decimal" Nullable="true" />
<Property Name="UnitsInStock" Type="Int16" Nullable="true" />
</EntityType>
<EntityType Name="Supplier">
<Key>
<PropertyRef Name="SupplierID" />
</Key>
<Property Name="SupplierID" Type="Int32" Nullable="false" />
<Property Name="CompanyName" Type="String" Nullable="false" />
<Property Name="ContactName" Type="String" Nullable="true" />
<Property Name="HomePage" Type="String" Nullable="true" />
</EntityType>
<EntityContainer Name="LOB-Data">
<EntitySet Name="Products" EntityType="Product" />
<EntitySet Name="Suppliers" EntityType="Supplier" />
</EntityContainer>
</Schema>
エンティティ コンテナの詳細については、「エンティティ コンテナ (EDM)」を参照してください。
Multiple-Entity-Sets-per-Type
Entity Data Model (EDM) では、単一のエンティティ コンテナ内または複数のエンティティ コンテナ内で、同じエンティティ型に対して複数のエンティティ セットを定義できます。型ごとに複数のエンティティ セットを定義できる Multiple-Entity-Sets-per-Type (MEST) の機能により、ユーザーは、データベースがパーティション分割されているなど、複数のテーブルが同じ構造を共有しているようなシナリオで、コーディングを省力化できます。
データベースがパーティション分割される背景には、パフォーマンス、可用性、管理性など、さまざまな理由があります。膨大な数の顧客口座を管理する金融機関では、顧客データの地理的分布に基づいてデータベース システムをパーティション分割することによって、パフォーマンスの向上を図る場合があります。対象データを地理的条件に基づくサブセットに限定することで、データの検索と更新を高速化することが可能です。MEST の実装では、同じデータベース内でのパーティション分割が前提となります。複数のデータベースにまたがるパーティション分割では、異なる接続文字列および異なるコンテキストが要求され、MEST のシナリオを適用することはできません。
パーティション分割が利用されるシナリオは、それだけではありません。たとえば、IT 部門が、アクセス頻度の高いデータについては夜間にバックアップし、その一方で、1 年以上アクセスされていないデータについてはアーカイブするようなケースです。この場合、DBA は、1 年以上利用されていない口座データを、同じデータベース内の同じテーブル スキーマを持ったアーカイブ テーブルにアーカイブすることができます。
複数のエンティティ セットに属するエンティティ型間のアソシエーションの構造を考慮することは重要です。MEST は、テスト済みの構造に従って、きわめて簡単に実装できます。次のようなシナリオが既に実証されています。
一対多のアソシエーションでは、"一" の側で MEST として実装されたエンティティには、"多" の側で 2 つの異なるエンティティ セットとのリレーションシップを割り当てる必要があります。たとえば、次のシナリオは、
Customer
エンティティ型を、PreferedCustomers
とCreditRiskCustomers
の 2 つのエンティティ セットに含めることによって実装できます。PreferedCustomers <1-----*> Orders
CreditRiskCustomers <1-----*> CreditReports
一対多のアソシエーションでは、"一" の側のエンティティ セットに、"多" の側で MEST として実装されたエンティティとのアソシエーションを割り当てることができます。たとえば、
Product
エンティティを 2 つのエンティティ セットと、ManufacturingUnit
エンティティとのアソシエーションに含めることができます。ManufacturingUnit <1-----*> Products
ManufacturingUnit <1----*> DefectiveProducts
論理モデルの設計時や、論理モデルと概念モデルとのマッピング時に、"一対一" または "多対多" のシナリオで MEST を実装することは困難です。一対一および多対多の MEST の問題は、"一" の側に MEST を割り当て、同じエンティティ セットに対するリレーションシップを "多" の側に割り当てる場合と同じです。一対一の場合、一対多の場合と同様の論理モデルを作成できます。
次の注文シナリオでは、論理モデルの設計時に問題が発生します。
PreferedCustomers <1-----*> Orders
CreditRiskCustomers <1-----*> Orders
詳細については、「Multiple-Entity-Sets-per-Type でモデルを定義する方法 (Entity Framework)」を参照してください。
参照
概念
アソシエーション (EDM)
アソシエーション セット (EDM)
エンティティ コンテナ (EDM)
Entity Data Model の型
単純型 (EDM)