Northwind の概念スキーマ (EDM)
エンティティ データ モデル (EDM) エンティティおよびアソシエーションは、アプリケーション コードのプログラミング可能なオブジェクトの正式な仕様です。既存のデータが存在してもしなくても、エンティティとアソシエーションは、概念スキーマ定義言語 (CSDL) 構文で定義されます。通常、EDM 上で構築されたアプリケーションを設計する際は、最初に CSDL でスキーマを書き込みます。
このトピックおよび前後のトピックで紹介した EDM アプリケーションは、Northwind サンプル データベースの既存のデータを使用します。そのため、ストレージ モデルは既に実装されています。このアプリケーションでデータを使用する場合、アプリケーションのドメインでエンティティ型とアソシエーションを定義する際、既存のテーブルの構造に注意する必要があります。
スキーマおよびマッピング スキーマから構築されたオブジェクト モデルを使用することによって、概念スキーマ、ストレージ メタデータ、マッピング スキーマ、およびアプリケーション コードが実装に含められます。
4 つのエンティティと 2 つのアソシエーションがこのセクションのスキーマ例で定義されます。定義されたエンティティ型は、ADO.NET と共にインストールされる基本クラス スキーマから派生します。スキーマとマッピングの概要については、「スキーマおよびマッピング スキーマ (Entity Framework)」を参照してください。
次の例では、開始タグ <Schema> に、定義する名前空間の宣言である NorthwindLib が含まれます。名前空間には、スキーマの本文で短い識別子として使用される別名 Self が含まれています。開始タグ <Schema> の URL は、すべての EDM アプリケーションで同じです。
<Documentation> タグには、開発者にとって役立つ情報が含まれています。Documentation タグ間のテキストは、コードのコメントよりも長くなります。つまり、オブジェクト ライブラリが構築された後、Visual Studio のオブジェクト ブラウザおよびクラスの参照に使用される他のツールに情報が表示されます。この例では、テキストによって、この XML ファイルで定義されたスキーマが識別されます。
この例の 3 つのエンティティは、<EntityType> タグ内で定義されています。各エンティティには、この型のインスタンスの一意の識別子であるエンティティのプロパティを示す Key 属性が含まれています。2 つの <Association> 型は、アソシエーションによって関連する型の範囲を指定する Name プロパティと End Role プロパティによって指定されています。この例では、一方のアソシエーションとナビゲーション プロパティによって、Product エンティティのインスタンスと、論理的な関係にある Category エンティティが接続されます。もう一方のアソシエーションによって、Order インスタンスと商品を注文した Customers のインスタンスが接続されます。アソシエーションの詳細については、「Entity Data Model のリレーションシップ」を参照してください。
<?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="NorthwindLib" Alias="Self">
<EntityType Name="Product">
<Key>
<PropertyRef Name="ProductID" />
</Key>
<Property Name="ProductID" Type="Int32" Nullable="false" />
<Property Name="ProductName" Type="String"
Nullable="false" ConcurrencyMode="Fixed" />
<Property Name="UnitPrice" Type="Decimal"
Nullable="true" ConcurrencyMode="Fixed" />
<NavigationProperty Name="Category"
Relationship="Self.Category_Product" FromRole="Product"
ToRole="Category" />
</EntityType>
<EntityType Name="DiscontinuedProduct" BaseType="Self.Product">
<!-- Units in stock for discontinued products. -->
<Property Name="UnitsInStock" Type="Int16" Nullable="true" />
</EntityType>
<EntityType Name="Customer">
<Key>
<PropertyRef Name="CustomerID" />
</Key>
<Property Name="CustomerID" Type="String" Nullable="false" />
<Property Name="CompanyName" Type="String"
Nullable="false" ConcurrencyMode="Fixed" />
<Property Name="ContactName" Type="String"
Nullable="true" ConcurrencyMode="Fixed" />
<Property Name="City" Type="String"
Nullable="true" ConcurrencyMode="Fixed" />
<Property Name="Country" Type="String"
Nullable="true" ConcurrencyMode="Fixed" />
<NavigationProperty Name="SalesOrders"
Relationship="Self.Customer_Order" FromRole="Customer"
ToRole="SalesOrder" />
</EntityType>
<EntityType Name="Category">
<Key>
<PropertyRef Name="CategoryID" />
</Key>
<Property Name="CategoryID" Type="Int32" Nullable="false" />
<Property Name="CategoryName" Type="String"
Nullable="false" ConcurrencyMode="Fixed" />
<Property Name="Description" Type="String" Nullable="true" />
<NavigationProperty Name="Products"
Relationship="Self.Category_Product"
FromRole="Category" ToRole="Product" />
</EntityType>
<EntityType Name="SalesOrder">
<Key>
<PropertyRef Name="OrderID" />
</Key>
<Property Name="OrderID" Type="Int32" Nullable="false" />
<Property Name="OrderDate" Type="DateTime" Nullable="true" />
<Property Name="ShipCity" Type="String" Nullable="true" />
<Property Name="ShipCountry" Type="String" Nullable="true" />
<NavigationProperty Name="Customer"
Relationship="Self.Customer_Order"
FromRole="SalesOrder" ToRole="Customer" />
</EntityType>
<Association Name="Customer_Order">
<End Role="Customer" Type="Self.Customer" Multiplicity="1" />
<End Role="SalesOrder" Type="Self.SalesOrder" Multiplicity="*" />
</Association>
<Association Name="Category_Product">
<End Role="Category" Type="Self.Category" Multiplicity="1" />
<End Role="Product" Type="Self.Product" Multiplicity="*" />
</Association>
<EntityContainer Name="Northwind">
<EntitySet Name="Categories" EntityType="Self.Category" />
<EntitySet Name="Products" EntityType="Self.Product" />
<EntitySet Name="Customers" EntityType="Self.Customer" />
<EntitySet Name="SalesOrders" EntityType="Self.SalesOrder" />
<AssociationSet Name="CustomerOrders"
Association="Self.Customer_Order">
<End Role="Customer" EntitySet="Customers" />
<End Role="SalesOrder" EntitySet="SalesOrders" />
</AssociationSet>
<AssociationSet Name="CategoryProducts"
Association="Self.Category_Product">
<End Role="Category" EntitySet="Categories" />
<End Role="Product" EntitySet="Products" />
</AssociationSet>
</EntityContainer>
</Schema>
このスキーマで最もよく使用されるタグは <Property> タグです。プロパティによって、各 <EntityType> に含まれるさまざまな種類のデータが指定されます。たとえば、Product のプロパティには、ProductID、ProductName、UnitPrice、およびこの製品を類似する一連の製品に関連付ける Category という名前の NavigationProperty が含まれています。この一連のプロパティによって、Product エンティティが定義されます。
EDM <EntityContainer> タグによって、ストレージ メタデータ スキーマのデータベース オブジェクト (dbo) にマップされるコンテナが指定されます。この <EntityContainer> では、3 つの <EntitySet> 仕様と 2 つの <AssociationSet> 仕様が存在します。
この CSDL ファイルで使用される XML 構文の詳細については、「スキーマ (EDM)」を参照してください。ナビゲーション プロパティの詳細については、「アソシエーションの実装 (EDM)」を参照してください。
参照
概念
Entity Data Model の型
Entity Data Model のリレーションシップ
スキーマ (EDM)
アソシエーションの実装 (EDM)