HOW TO:使用對應至兩份資料表的單一實體來定義模型
在 Entity Data Model (EDM) 中使用舊有資料時,如果能夠將單一實體對應至資料庫中的兩份資料表,有時會很有用。這項作業可以在兩份資料表共用相同的索引鍵時完成,例如 SQL Server 2005 隨附之 AdventureWorks 範例資料庫的 Customer 和 Store 資料表。
根據下列各節的說明,建立使用 AdventureWorks 資料庫之 Customer 和 Store 資料表的 EDM 並修改 *.edmx 檔案。然後,使用 HOW TO:使用對應至個別資料表的實體來建立和執行物件查詢主題中所示範的程式碼來測試這個資料模型。
若要實作概念結構定義語言 (CSDL) 需求
找出 *.edmx 檔案的 <edmx:ConceptualModels> 區段。
移除代表 Customer 實體的 <EntityType> 標記。
移除 <Key> 標記、<PropertyRef> 標記,以及現在已刪除之 Customer 實體的名稱和識別碼 StoreID。
將已刪除之 Customer 實體的屬性移入 Store 實體的 <EntityType> 標記中。
將現在已刪除之 Customer 實體的 rowguid 屬性重新命名為 Cust_rowguid。
將現在已刪除之 Customer 實體的 ModifiedDate 屬性重新命名為 Cust_ModifiedDate。
此概念結構描述如下所示。
<edmx:ConceptualModels>
<Schema Namespace="AdventureWorksModel" Alias="Self"
xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
<EntityContainer Name="AdventureWorksEntities">
<EntitySet Name="Store"
EntityType="AdventureWorksModel.Store" />
</EntityContainer>
<EntityType Name="Store">
<Key>
<PropertyRef Name="CustomerID" />
</Key>
<Property Name="CustomerID" Type="Int32" Nullable="false" />
<Property Name="Name" Type="String"
Nullable="false" MaxLength="50" />
<Property Name="SalesPersonID" Type="Int32" />
<Property Name="Demographics" Type="String"
MaxLength="1073741823" />
<Property Name="rowguid" Type="Guid" Nullable="false" />
<Property Name="ModifiedDate" Type="DateTime"
Nullable="false" />
<Property Name="TerritoryID" Type="Int32" />
<Property Name="AccountNumber" Type="String"
Nullable="false"
MaxLength="10" Unicode="false" />
<Property Name="CustomerType" Type="String"
Nullable="false"
MaxLength="1" FixedLength="true" />
<Property Name="Cust_rowguid" Type="Guid"
Nullable="false" />
<Property Name="Cust_ModifiedDate" Type="DateTime"
Nullable="false" />
</EntityType>
</Schema>
</edmx:ConceptualModels>
若要實作存放結構定義語言 (SSDL) 需求
找出 *.edmx 檔案的 <edmx:StorageModels> 區段。
將 SSDL 結構描述保持不變,如下所示:
<edmx:StorageModels>
<Schema Namespace="AdventureWorksModel.Store" Alias="Self"
Provider="System.Data.SqlClient"
ProviderManifestToken="2005"
xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
<EntityContainer Name="Sales">
<EntitySet Name="Customer"
EntityType="AdventureWorksModel.Store.Customer" />
<EntitySet Name="Store"
EntityType="AdventureWorksModel.Store.Store" />
<AssociationSet Name="FK_Store_Customer_CustomerID"
Association="AdventureWorksModel.Store.FK_Store_Customer_CustomerID">
<End Role="Customer" EntitySet="Customer" />
<End Role="Store" EntitySet="Store" />
</AssociationSet>
</EntityContainer>
<EntityType Name="Customer">
<Key>
<PropertyRef Name="CustomerID" />
</Key>
<Property Name="CustomerID" Type="int"
Nullable="false" StoreGeneratedPattern="Identity" />
<Property Name="TerritoryID" Type="int" />
<Property Name="AccountNumber" Type="varchar"
Nullable="false" MaxLength="10" />
<Property Name="CustomerType" Type="nchar"
Nullable="false" MaxLength="1" />
<Property Name="rowguid"
Type="uniqueidentifier" Nullable="false" />
<Property Name="ModifiedDate" Type="datetime"
Nullable="false" />
</EntityType>
<EntityType Name="Store">
<Key>
<PropertyRef Name="CustomerID" />
</Key>
<Property Name="CustomerID" Type="int" Nullable="false" />
<Property Name="Name" Type="nvarchar"
Nullable="false" MaxLength="50" />
<Property Name="SalesPersonID" Type="int" />
<Property Name="Demographics" Type="xml" />
<Property Name="rowguid" Type="uniqueidentifier"
Nullable="false" />
<Property Name="ModifiedDate" Type="datetime"
Nullable="false" />
</EntityType>
<Association Name="FK_Store_Customer_CustomerID">
<End Role="Customer"
Type="AdventureWorksModel.Store.Customer" Multiplicity="1" />
<End Role="Store" Type="AdventureWorksModel.Store.Store"
Multiplicity="0..1" />
<ReferentialConstraint>
<Principal Role="Customer">
<PropertyRef Name="CustomerID" />
</Principal>
<Dependent Role="Store">
<PropertyRef Name="CustomerID" />
</Dependent>
</ReferentialConstraint>
</Association>
</Schema>
</edmx:StorageModels>
若要實作對應規格語言 (MSL) 需求
找出 *.edmx 檔案的 <edmx:Mappings> 區段。
從對應規格中移除 Customer 實體集合的 <EntitySetMapping> 標記。
從對應規格中移除 Customer 實體類型的 <EntityTypeMapping> 標記。
將 Customer StoreEntitySet 的 <MappingFragment> 移入 StoreEntitySet 的 EntityType 對應中。
此對應規格如下所示。
<edmx:Mappings>
<Mapping Space="C-S"
xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
<EntityContainerMapping StorageEntityContainer="Sales"
CdmEntityContainer="AdventureWorksEntities">
<EntitySetMapping Name="Store">
<EntityTypeMapping
TypeName="IsTypeOf(AdventureWorksModel.Store)">
<MappingFragment StoreEntitySet="Store">
<ScalarProperty Name="CustomerID"
ColumnName="CustomerID" />
<ScalarProperty Name="Name" ColumnName="Name" />
<ScalarProperty Name="SalesPersonID"
ColumnName="SalesPersonID" />
<ScalarProperty Name="Demographics"
ColumnName="Demographics" />
<ScalarProperty Name="rowguid"
ColumnName="rowguid" />
<ScalarProperty Name="ModifiedDate"
ColumnName="ModifiedDate" />
</MappingFragment>
<MappingFragment StoreEntitySet="Customer">
<ScalarProperty Name="CustomerID"
ColumnName="CustomerID" />
<ScalarProperty Name="TerritoryID"
ColumnName="TerritoryID" />
<ScalarProperty Name="AccountNumber"
ColumnName="AccountNumber" />
<ScalarProperty Name="CustomerType"
ColumnName="CustomerType" />
<ScalarProperty Name="Cust_rowguid"
ColumnName="rowguid" />
<ScalarProperty Name="Cust_ModifiedDate"
ColumnName="ModifiedDate" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
</EntityContainerMapping>
</Mapping>
</edmx:Mappings>