方法: 単一のエンティティが 2 つのテーブルにマップされたモデルを定義する
このトピックでは、基になるデータベース内にある 2 つのテーブルにエンティティ型がマップされた概念モデルを手動で作成する方法について説明します。 この方法で作成した概念モデルを使用して、エンティティ型を 3 つ以上のテーブルにマップすることもできます。
注 : |
---|
エンティティ型が複数のテーブルにマップされたモデルを定義するには、ADO.NET Entity Data Model Toolsを使用することをお勧めします。詳細については、「Walkthrough: Mapping an Entity to Multiple Tables」を参照してください。 |
エンティティ型を複数のテーブルにマップできるのは、次の条件が満たされた場合に限られます。
マップ先のテーブルの共通キーがすべて同じである。
マップされるエンティティ型のエントリが、基になる各テーブルに存在する。 つまり、エンティティ型が、2 つのテーブル間で一対一の対応関係を持つデータを表している必要があります (エンティティ型が 2 つのテーブルの内部結合を表す)。
エンティティが 2 つのテーブルにマップされたモデルを手動で定義するための基本手順は、次のとおりです。
基になる各テーブルの列に対応するプロパティを持つエンティティ型を定義します。 詳細については、「EntityType 要素 (CSDL)」を参照してください。
基になるテーブルごとに MappingFragment 要素を使用してエンティティ型のマッピングを定義します。 詳細については、「EntityTypeMapping 要素 (MSL)」および「MappingFragment 要素 (MSL)」を参照してください。
次の例では、School サンプル データベースがインストールされ、Entity Framework を使用するようにプロジェクトが手動で構成されていることを前提としています。 詳細については、「School サンプル データベースの作成 (Entity Framework クイック スタート)」および「Entity Framework の構成 (Entity Framework タスク)」を参照してください。
注 : |
---|
下の例では、エンティティ型を School サンプル データベースの Person テーブルと OfficeAssignement テーブルにマップします。エンティティ型をこれらのテーブルにマップするための条件は満たされています。つまり、2 つのテーブルの内部結合により、全員にオフィスが割り当てられます。 |
ストレージ モデルを作成するには
次の XML ファイルをプロジェクトに追加し、
School.ssdl
という名前を付けます。<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="OfficeAssignment" EntityType="SchoolModel.Store.OfficeAssignment" store:Type="Tables" Schema="dbo" /> <EntitySet Name="Person" EntityType="SchoolModel.Store.Person" store:Type="Tables" Schema="dbo" /> </EntityContainer> <EntityType Name="OfficeAssignment"> <Key> <PropertyRef Name="InstructorID" /> </Key> <Property Name="InstructorID" Type="int" Nullable="false" /> <Property Name="Location" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="Timestamp" Type="timestamp" Nullable="false" StoreGeneratedPattern="Computed" /> </EntityType> <EntityType Name="Person"> <Key> <PropertyRef Name="PersonID" /> </Key> <Property Name="PersonID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" /> <Property Name="LastName" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="FirstName" Type="nvarchar" Nullable="false" MaxLength="50" /> <Property Name="HireDate" Type="datetime" /> <Property Name="EnrollmentDate" Type="datetime" /> </EntityType> </Schema>
概念モデルを作成するには
次の XML ファイルをプロジェクトに追加し、
School.csdl
という名前を付けます。 次の点に注意してください。Instructor エンティティ型には、Person テーブルおよび OfficeAssignment テーブルのすべての列にマップされるプロパティがあります (テーブルの詳細については、上のストレージ モデルを参照)。
注 : Instructor エンティティ型は継承型なので、Person 基本型からすべてのプロパティを継承します。Instructor 型に固有のプロパティに加えて、Instructor エンティティ型には、基になるテーブルのすべての列にマップされるプロパティがあります。
<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="People" EntityType="SchoolModel.Person" /> </EntityContainer> <EntityType Name="Person"> <Key> <PropertyRef Name="PersonID" /> </Key> <Property Type="Int32" Name="PersonID" Nullable="false" annotation:StoreGeneratedPattern="Identity" /> <Property Type="String" Name="LastName" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" /> <Property Type="String" Name="FirstName" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" /> <Property Type="DateTime" Name="EnrollmentDate" /> </EntityType> <EntityType Name="Instructor" BaseType="SchoolModel.Person" > <Property Type="DateTime" Name="HireDate" Nullable="false" /> <Property Type="Binary" Name="Timestamp" Nullable="false" MaxLength="8" FixedLength="true" annotation:StoreGeneratedPattern="Computed" /> <Property Type="String" Name="Location" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" /> </EntityType> </Schema>
概念モデルとストレージ モデルの間のマッピングを定義するには
次の XML ファイルをプロジェクトに追加し、
School.msl
という名前を付けます。 次の点に注意してください。- Instructor エンティティ型の EntityTypeMapping 要素内では、プロパティを適切なテーブルにマップするために、個別の MappingFragment 要素が使用されます。
<Mapping Space="C-S" xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs"> <EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer" CdmEntityContainer="SchoolEntities"> <EntitySetMapping Name="People"> <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Instructor)"> <MappingFragment StoreEntitySet="Person"> <ScalarProperty Name="PersonID" ColumnName="PersonID" /> <ScalarProperty Name="HireDate" ColumnName="HireDate" /> <Condition ColumnName="HireDate" IsNull="false" /> </MappingFragment> <MappingFragment StoreEntitySet="OfficeAssignment"> <ScalarProperty Name="PersonID" ColumnName="InstructorID" /> <ScalarProperty Name="Timestamp" ColumnName="Timestamp" /> <ScalarProperty Name="Location" ColumnName="Location" /> </MappingFragment> </EntityTypeMapping> <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Person)"> <MappingFragment StoreEntitySet="Person"> <ScalarProperty Name="PersonID" ColumnName="PersonID" /> <ScalarProperty Name="LastName" ColumnName="LastName" /> <ScalarProperty Name="FirstName" ColumnName="FirstName" /> <ScalarProperty Name="EnrollmentDate" ColumnName="EnrollmentDate" /> </MappingFragment> </EntityTypeMapping> </EntitySetMapping> </EntityContainerMapping> </Mapping>