방법: 두 테이블에 매핑된 단일 엔터티를 사용하여 모델 정의
EDM(엔터티 데이터 모델)에서 레거시 데이터를 사용하는 경우 단일 엔터티를 데이터베이스의 두 테이블에 매핑하는 기능이 유용할 수 있습니다. 이 기능은 SQL Server 2005에 포함되어 있는 AdventureWorks 샘플 데이터베이스의 Customer 및 Store 테이블과 마찬가지로 두 테이블이 공통 키를 공유하고 있는 경우 수행할 수 있습니다.
AdventureWorks 데이터베이스의 Customer 및 Store 테이블을 사용하는 EDM을 만든 후 다음 단원에서와 같이 *.edmx 파일을 수정합니다. 방법: 별도의 테이블에 매핑된 엔터티를 사용하여 개체 쿼리 만들기 및 실행 항목의 코드를 사용하여 이 데이터 모델을 테스트합니다.
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>