Table-Per-Type 継承でモデルを定義する方法 (Entity Framework)
このトピックでは、Table-Per-Type 継承階層を持つ概念モデルを手動で作成する方法について説明します。 Table-Per-Type 継承は、データベース内の別個のテーブルを使用して、非継承プロパティと継承階層のそれぞれの型のキー プロパティのデータを維持します。
注 : |
---|
Table-Per-Type 継承を持つモデルを定義するには、ADO.NET Entity Data Model Toolsを使用することをお勧めします。詳細については、「Walkthrough: Mapping Inheritance - Table-per-Type」を参照してください。 |
Table-Per-Type 継承を持つモデルを手動で定義するための基本手順は、次のとおりです。
基本エンティティ型および派生型を含む概念モデルで 1 つのエンティティ セットを定義します。 詳細については、「EntitySet 要素 (CSDL)」を参照してください。
BaseType 属性を使用して概念モデルの派生エンティティ型を定義し、派生型の非継承プロパティのみを定義します。 詳細については、「EntityType 要素 (CSDL)」を参照してください。
マッピング スキーマ言語 (MSL) の同じ EntitySetMapping 要素で、基本エンティティ型と派生型をマップします。 継承プロパティを、該当するテーブルの列にマップします。 TypeName 属性の値を設定するときに
IsTypeOf
構文を使用します。 詳細については、「EntitySetMapping 要素 (MSL)」を参照してください。
次の例では、School サンプル データベースがインストールされ、Entity Framework を使用するようにプロジェクトが手動で構成されていることを前提としています。 詳細については、「School サンプル データベースの作成 (Entity Framework クイック スタート)」および「Entity Framework の構成 (Entity Framework タスク)」を参照してください。
ストレージ モデルを作成するには
次の XML ファイルをプロジェクトに追加し、
School.ssdl
という名前を付けます。<?xml version="1.0" encoding="utf-8" ?> <Schema Namespace="SchoolModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="https://schemas.microsoft.com/ado/2009/02/edm/ssdl"> <EntityContainer Name="SchoolModelStoreContainer"> <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" store:Type="Tables" Schema="dbo" /> <EntitySet Name="OnlineCourse" EntityType="SchoolModel.Store.OnlineCourse" store:Type="Tables" Schema="dbo" /> <EntitySet Name="OnsiteCourse" EntityType="SchoolModel.Store.OnsiteCourse" store:Type="Tables" Schema="dbo" /> </EntityContainer> <EntityType Name="Course"> <Key> <PropertyRef Name="CourseID" /> </Key> <Property Name="CourseID" Type="int" Nullable="false" /> <Property Name="Title" Type="nvarchar" Nullable="false" MaxLength="100" /> <Property Name="Credits" Type="int" Nullable="false" /> <Property Name="DepartmentID" Type="int" Nullable="false" /> </EntityType> <EntityType Name="OnlineCourse"> <Key> <PropertyRef Name="CourseID" /> </Key> <Property Name="CourseID" Type="int" Nullable="false" /> <Property Name="URL" Type="nvarchar" Nullable="false" MaxLength="100" /> </EntityType> <EntityType Name="OnsiteCourse"> <Key> <PropertyRef Name="CourseID" /> </Key> <Property Name="CourseID" Type="int" Nullable="false" /> <Property Name="Location" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="Days" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="Time" Type="smalldatetime" Nullable="false" /> </EntityType> </Schema>
概念モデルを作成するには
次の XML ファイルをプロジェクトに追加し、
School.csdl
という名前を付けます。 次の点に注意してください。Course、OnlineCourse、および OnsiteCourse の 3 つのエンティティ型に対して 1 つのエンティティ セット Courses のみが定義されています。
定義の
BaseType
属性で示されているように、OnlineCourse エンティティ型と OnsiteCourse エンティティ型は派生型です。OnlineCourse エンティティ型および OnsiteCourse エンティティ型に対して定義されているプロパティは、非継承プロパティのみです。
<?xml version="1.0" encoding="utf-8" ?> <Schema Namespace="SchoolModel" Alias="Self" xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="https://schemas.microsoft.com/ado/2008/09/edm"> <EntityContainer Name="SchoolEntities" annotation:LazyLoadingEnabled="true"> <EntitySet Name="Courses" EntityType="SchoolModel.Course" /> </EntityContainer> <EntityType Name="Course"> <Key> <PropertyRef Name="CourseID" /> </Key> <Property Name="CourseID" Type="Int32" Nullable="false" /> <Property Name="Title" Type="String" Nullable="false" MaxLength="100" Unicode="true" FixedLength="false" /> <Property Name="Credits" Type="Int32" Nullable="false" /> <Property Name="DepartmentID" Type="Int32" Nullable="false" /> </EntityType> <EntityType Name="OnlineCourse" BaseType="SchoolModel.Course"> <Property Name="URL" Type="String" Nullable="false" MaxLength="100" Unicode="true" FixedLength="false" /> </EntityType> <EntityType Name="OnsiteCourse" BaseType="SchoolModel.Course"> <Property Name="Location" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" /> <Property Name="Days" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" /> <Property Name="Time" Type="DateTime" Nullable="false" /> </EntityType> </Schema>
概念モデルとストレージ モデルの間のマッピングを定義するには
次の XML ファイルをプロジェクトに追加し、
School.msl
という名前を付けます。 次の点に注意してください。Course、OnlineCourse、および OnsiteCourse の各エンティティ型のマッピングは、同じ EntitySetMapping 要素で定義されています。
OnlineCourse および OnsiteCourse の CourseID 継承プロパティは、基になるデータベース テーブル内の対応する列にマップされます。
エンティティ型のマッピングごとに、
IsTypeOf
構文を使用して、マップされているエンティティ型を示します。
<?xml version="1.0" encoding="utf-8" ?> <Mapping Space="C-S" xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs"> <EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer" CdmEntityContainer="SchoolEntities"> <EntitySetMapping Name="Courses"> <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Course)"> <MappingFragment StoreEntitySet="Course"> <ScalarProperty Name="CourseID" ColumnName="CourseID" /> <ScalarProperty Name="Title" ColumnName="Title" /> <ScalarProperty Name="Credits" ColumnName="Credits" /> <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" /> </MappingFragment> </EntityTypeMapping> <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.OnlineCourse)"> <MappingFragment StoreEntitySet="OnlineCourse"> <ScalarProperty Name="CourseID" ColumnName="CourseID" /> <ScalarProperty Name="URL" ColumnName="URL" /> </MappingFragment> </EntityTypeMapping> <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.OnsiteCourse)"> <MappingFragment StoreEntitySet="OnsiteCourse"> <ScalarProperty Name="CourseID" ColumnName="CourseID" /> <ScalarProperty Name="Location" ColumnName="Location" /> <ScalarProperty Name="Days" ColumnName="Days" /> <ScalarProperty Name="Time" ColumnName="Time" /> </MappingFragment> </EntityTypeMapping> </EntitySetMapping> </EntityContainerMapping> </Mapping>
参照
処理手順
Table-Per-Hierarchy 継承でモデルを定義する方法 (Entity Framework)
その他のリソース
CSDL、SSDL、および MSL 仕様
Entity Data Model: Inheritance
高度なデータ モデルの定義 (Entity Framework タスク)