エンティティの実装 (EDM)
すべての エンティティ データ モデル (EDM) アプリケーションにおいて、エンティティは概念スキーマ定義言語 (CSDL) で定義され、データ構造がストア スキーマ定義言語 (SSDL) で記述されるメタデータにマップされます。この例では、単一のエンティティのデザインと、エンティティをストレージにマップする方法を示します。
このサンプル エンティティのデザイン対象となるアプリケーションでは、企業の従業員に関する情報を定義します。
概念スキーマ
次の概念スキーマ定義言語 (CSDL) 構文に定義されているエンティティは、Employes
という名前の名前空間のデータ型の指定を含んでいます。名前空間には、単独の EntityType 宣言である Employees
が含まれます。
Employees
エンティティのプロパティは、従業員を識別するための基本的な情報を格納します。EmployeeId
プロパティは、型のインスタンスを一意に識別する Guid として宣言されています。EmployeeId
プロパティは、キーとしてタグ付けされています。
さらに、従業員を識別する 3 つのプロパティとして、FirstName
、LastName
、および Email
(アドレス) が定義されています。
エンティティの指定に加え、CSDL スキーマには、EntitySet と EntityContainer の宣言が含まれています。EntityContainer と EntitySet の指定は、データ モデルのデータ型のスコープを定義します。EntityContainer には EntitySet が含まれます。この例では、Employees
という名前の EntitySet に Employee
型が含まれます。
<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="Employees" Alias="Self" xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
<EntityContainer Name="EmployeesContext">
<EntitySet Name="Employees" EntityType="Employees.Employees" />
</EntityContainer>
<EntityType Name="Employees">
<Key>
<PropertyRef Name="EmployeeId" />
</Key>
<Property Name="EmployeeId" Type="Guid" Nullable="false" />
<Property Name="LastName" Type="String" Nullable="false" />
<Property Name="FirstName" Type="String" Nullable="false" />
<Property Name="Email" Type="String" Nullable="false" />
</EntityType>
</Schema>
名前空間スキーマには、Employee
エンティティと、スキーマ Namespace とは別個の独立した EntityContainer を除くすべてのセットが含まれます。EntityContainer の詳細については、「EntityContainerMapping 要素 (MSL)」を参照してください。
このデータ モデルに基づいて構築されたアプリケーションは、名前空間を参照して、このモデルに基づいて構築されたクラスを使用します。
この CSDL 指定は、概念スキーマまたはデザイン スキーマと呼ばれます。SSDL 構文におけるストレージ メタデータのパラレル エンティティ名は、ストレージ構造に対応します。この CSDL スキーマの EntitySet は、SSDL スキーマに指定されたテーブルの名前に対応します。このテーブルは、モデルに基づいて構築されたアプリケーションによって使用される Employee
エンティティのインスタンスのデータを格納します。Employee
エンティティのプロパティは、テーブルの列に対応します。
ストア スキーマ
SSDL のストレージ メタデータは、概念スキーマに定義された Employees
のインスタンスが格納されているデータベースを記述します。
次のスキーマに定義されている Employees.Store
名前空間は、概念スキーマに定義されているモデル Employees
のターゲット データベースです。
このスキーマの EntitySetEmployees
は、Employees
という名前のデータ テーブルを表します。このスキーマによって指定された EntityType は、概念スキーマに定義されている EntityType に対応します。ストレージ メタデータ内の名前は必ずしも概念スキーマ内の名前と一致する必要はありませんが、データベース テーブルの名前と一致する必要があります。
次のスキーマは、SSDL ファイルに指定された EntityContainer によって表されるデータベース オブジェクト dbo
を記述します。この例の EntityContainer には、Employees
という名前のテーブルが含まれます。
?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="Employees.Store" Alias="Self"
Provider="System.Data.SqlClient"
ProviderManifestToken="2005"
xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
<EntityContainer Name="dbo">
<EntitySet Name="Employees" EntityType="Employees.Store.Employees" />
</EntityContainer>
<EntityType Name="Employees">
<Key>
<PropertyRef Name="EmployeeId" />
</Key>
<Property Name="EmployeeId" Type="uniqueidentifier" Nullable="false" />
<Property Name="LastName" Type="nvarchar" Nullable="false" MaxLength="50" />
<Property Name="FirstName" Type="nvarchar" Nullable="false" />
<Property Name="Email" Type="nvarchar" Nullable="false" />
</EntityType>
</Schema>
マッピング スキーマ
マッピング スキーマは、マッピング スキーマ言語 (MSL) で定義します。この MSL 仕様は、SSDL スキーマ内のメタデータを使用して CSDL スキーマをデータベースに関連付けます。
この MSL スキーマの要素には、EntityContainerMapping、StorageEntityContainer、EntityTypeMapping、MappingFragment、および ScalarProperty のマッピングがあります。EntityContainerMapping は、CdmEntityContainer を StorageEntityContainer にマップします (この場合は、EmployeeSkills
エンティティ コンテナをデータベース オブジェクト dbo
にマップします)。
StorageEntityContainer および CdmEntityContainer に割り当てられる名前は、スキーマ名前空間で修飾されません。StorageEntityContainer と CdmEntityContainer は、概念スキーマとストレージ メタデータの両方において、スキーマ要素から別個に独立しています。StorageEntityContainer および CdmEntityContainer の名前を修飾するために名前空間名を使用すると、マッピング例外が発生します。
StorageEntityContainer と CdmEntityContainer のマッピングに続く EntitySetMapping は、概念型の TypeNameEmployees
に対応する StoreEntitySet
を指定します。
TypeName のプロパティは、ScalarProperty 要素によって、ColumnName 要素に対応する Name 属性としてマップされます (たとえば、Name="EmployeeId" ColumnName="EmployeeId"
)。構文 Name は、概念スキーマのエンティティのプロパティを指定します。ColumnName は、ターゲット データベースの Employees
データ テーブルの列を指定します。
<?xml version="1.0" encoding="utf-8"?>
<Mapping Space="C-S"
xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
<EntityContainerMapping StorageEntityContainer="dbo"
CdmEntityContainer="EmployeesContext">
<EntitySetMapping Name="Employees" StoreEntitySet="Employees"
TypeName="Employees.Employees">
<ScalarProperty Name="EmployeeId" ColumnName="EmployeeId" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="Email" ColumnName="Email" />
</EntitySetMapping>
</EntityContainerMapping>
</Mapping>