HOW TO:使用對應至兩份資料表的單一實體來定義模型
本主題描述如何手動建立概念模型,其中實體類型會對應到基礎資料庫中的兩個資料表。 您可以使用這些相同的概念,將實體類型對應到兩個以上的資料表。
注意: |
---|
建議您使用 ADO.NET Entity Data Model Tools來定義模型,讓模型中的實體類型對應到多個資料表。如需詳細資訊,請參閱Walkthrough: Mapping an Entity to Multiple Tables。 |
只有當下列條件成立時,才能將實體類型對應到多個資料表:
您所對應到的資料表會共用一個索引鍵。
正在對應的實體類型在每一個基礎資料表中都有項目。 換句話說,實體類型代表在兩個資料表之間擁有一對一關係的資料,實體類型代表兩個資料表的內部聯結 (Inner Join)。
如果要手動定義包含了對應至兩個資料表之實體的模型,基本步驟如下:
定義實體類型,其屬性會對應到每一個基礎資料表中的資料行。 如需詳細資訊,請參閱 EntityType 項目 (CSDL)。
針對每一個基礎資料表使用 MappingFragment 項目,定義實體類型的對應。 如需詳細資訊,請參閱 EntityTypeMapping 項目 (MSL) 和 MappingFragment 項目 (MSL)。
下列範例假設您已經安裝 School 範例資料庫,而且已經手動設定您的專案使用 Entity Framework 。 如需詳細資訊,請參閱建立 School 範例資料庫 (Entity Framework 快速入門)和設定 Entity Framework (Entity Framework 工作)。
注意: |
---|
下列範例會將實體類型對應到 School 範例資料庫中的 Person 和 OfficeAssignement 資料表。請注意,已符合將實體類型對應至這些資料表的條件。也就是說,兩個資料表的內部聯結 (Inner Join) 將會產生所有有分派辦公室的人。 |
若要建立儲存體模型
將下列 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>