상속(EDM)
EDM(엔터티 데이터 모델)에서는 상속을 통해 파생 형식을 사용하여 다른 형식의 기능을 확장할 수 있습니다.
일반적으로 응용 프로그램에서 사용하는 모델의 형식은 매우 다양합니다. 일부 엔터티 형식은 비즈니스 응용 프로그램의 Customer와 Order****처럼 별도의 개념을 모델링합니다. 이러한 데이터 형식은 멤버를 공유하지 않지만 서로 비슷한 다른 형식도 있습니다. 예를 들어 Customer와 Employee 형식이 있습니다. 이러한 형식은 서로 다른 개념을 모델링하기는 하지만 공통점을 가지고 있습니다. 두 형식은 모두 비즈니스 관계에 있는 사람을 나타내며 이름, 주소, 전화 번호 등의 정보를 저장하기 위한 속성을 포함합니다.
EDM 상속을 사용하면 한 형식을 다른 형식에서 파생할 수 있습니다. 예를 들어, Employee
와 Customer
는 둘 다 Contact
형식에서 상속할 수 있습니다. 이 경우, Contact
를 기본 형식이라고 하고, Employee
와 Customer
를 파생 형식이라고 합니다.
상속은 단일 수준으로 제한되지 않습니다. 즉, 파생 형식이 다른 엔터티 형식의 기본 형식이 될 수 있습니다. 예를 들어, Employee
는 Manager
의 기본 형식이 되고, Customer
는 PreferredCustomer
의 기본 형식이 될 수 있습니다. 이런 방식으로 상속 계층 구조가 구성됩니다.
CLR(공용 언어 런타임)과 마찬가지로 EDM 시스템은 데이터 형식에 대한 단일 상속만을 지원합니다. 엔터티 형식은 한 상위 형식의 속성만 직접 상속할 수 있습니다.
참고 |
---|
EDM 시스템에서는 메서드를 구현하지 않으므로 메서드 상속은 지원되지 않습니다. EDM에서는 도우미 메서드가 partial 클래스에서 구현됩니다. 자세한 내용은 도우미 메서드(EDM)를 참조하십시오. |
상속 예제
다음 예제에서는 앞에서 설명한 상속 계층 구조에 대한 부분적인 CSDL(개념 스키마 정의 언어) 사양을 보여 줍니다.
<EntityType Name="Contact">
<Key>
<PropertyRef Name="ContactId" />
</Key>
<Property Name="ContactId" Type="Int32" Nullable="false" />
<Property Name="Name" Type="String" />
<Property Name="Address" Type="Address" />
<Property Name="Phone" Type="String" />
</EntityType>
<EntityType Name="Customer" BaseType="Contact">
<Property Name="CustomerID" Type="String" />
<Property Name="CompanyName" Type="String" />
</EntityType>
<EntityType Name="PreferredCustomer" BaseType="Customer">
<Property Name="PreferenceCode" Type="String" />
<Property Name="CreditLimit" Type="Decimal" />
</EntityType>
<!-- Similar Declarations for Employee and Manager -->
상속의 한 가지 목적은 여러 형식 간에 기본 구조를 공유하는 것입니다. 상속을 사용하는 또 다른 이유는 확장성입니다. 상속 계층 구조가 구현되어 응용 프로그램에 배포된 후에도 개발자는 상속을 통해 형식을 확장할 수 있습니다.
개체 지향 프로그래밍 개념인 다형성 또는 값 대체성은 상속을 기반으로 합니다. 파생 데이터 형식의 모든 인스턴스 또한 기본 형식의 인스턴스입니다. 예를 들어, Manager
가 Employee
에서 파생된 경우 Manager
의 모든 인스턴스는 Employee
의 인스턴스입니다. 모든 직원(기본 형식)을 쿼리하면 모든 관리자(파생 형식)도 결과에 포함됩니다.
상속에 대한 자세한 내용은 방법: 형식당 하나의 테이블 상속을 사용하여 모델 정의 및 방법: 계층당 하나의 테이블 상속을 사용하여 모델 정의(Entity Framework)를 참조하십시오.
상속 구현
CSDL에 정의된 대로 상속 계층 구조는 EDM 모델 기반의 응용 프로그램 데이터를 저장하는 데이터베이스 테이블에서 구현해야 합니다. 상속 계층 구조의 형식을 데이터베이스 테이블에 구조화하는 방법에는 여러 가지가 있습니다.
모든 구현에서 기본 및 파생 형식의 키 구조는 같아야 합니다. 즉, Customer
형식이 Person
형식에서 파생된 경우 Customer
및 Person
형식 모두 같은 키 속성을 지정해야 합니다.
다중 테이블 상속 구현에서는 파생 형식을 상위 형식의 인스턴스로 식별하기 위해 여러 테이블의 키 속성에 같은 값을 할당합니다.
매핑 사양에서 상속 구현에 EntityTypeMapping의 IsTypeOf<T> 표시기를 사용하여 Customer
형식과 같은 파생 형식이 Person과 같은 기본 형식의 형식도 되도록 지정할 수 있습니다. EntityType의 BaseType 특성도 개념 스키마 및 저장소 스키마 모두에서 파생 엔터티의 기본 형식을 지정하는 데 사용할 수 있습니다.
계층당 하나의 테이블 모델
계층당 하나의 테이블 모델을 기반으로 하는 상속은 같은 데이터베이스 테이블을 사용하여 계층 구조의 여러 형식을 지정합니다. 이 모델에서는 매핑 사양의 명시적 조건을 통해 상속 계층 구조의 형식을 식별합니다.
각 형식을 구별하기 위해 테이블에 판별자 열이 포함되며, 조건은 각 형식에 대한 열에 할당된 값을 참조합니다. 예를 들어, 조건은 EntityType
열의 값이 Person 형식의 경우 P
와 같거나 Customer 형식의 경우 C
와 같다고 지정할 수 있습니다.
다음 매핑 예제에서는 Customer
및 Person
형식의 조건 매핑을 보여 줍니다.
<?xml version="1.0" encoding="utf-8"?>
<Mapping Space="C-S"
xmlns:cdm="urn:schemas-microsoft-com:windows:storage:mapping:CS"
xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
<EntityContainerMapping>
<EntitySetMapping Name="CCustomer1">
<EntityTypeMapping TypeName="CNorthwind.CCustomer">
<MappingFragment StoreEntitySet="SParty1">
<EntityKey>
<ScalarProperty Name="PartyID" ColumnName="PartyID" />
</EntityKey>
<ScalarProperty Name="PartyName" ColumnName="PartyName" />
<ScalarProperty Name="PartyTitle" ColumnName="Title" />
<ScalarProperty Name="ContactName" ColumnName="ContactName" />
<Condition Value="C" ColumnName="EntityType" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="CSupplier1">
<EntityTypeMapping TypeName="CNorthwind.CSupplier">
<MappingFragment StoreEntitySet="SParty1">
<EntityKey>
<ScalarProperty Name="PartyID" ColumnName="PartyID" />
</EntityKey>
<ScalarProperty Name="PartyName" ColumnName="PartyName" />
<ScalarProperty Name="PartyTitle" ColumnName="Title" />
<ScalarProperty Name="HomePage" ColumnName="HomePage" />
<Condition Value="S" ColumnName="EntityType" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
</EntityContainerMapping>
</Mapping>
형식당 하나의 테이블 모델
형식당 하나의 테이블 모델을 기반으로 하는 상속에서는 기본 형식 또는 상위 형식을 한 테이블에 저장하고, 파생 형식에 대해서는 추가 테이블을 사용합니다. 파생 형식과 관련된 필드는 파생 형식을 나타내는 테이블에만 생성합니다. 이 상속 모델의 엔터티 매핑은 여러 물리적 테이블에 걸쳐서 이루어집니다. 테이블에 행이 있는지 여부에 따라 계층 구조의 형식이 구분됩니다. 모든 테이블의 키 속성에는 같은 키 값이 할당됩니다.
EntityType의 BaseType 특성은 개념 스키마 및 저장소 스키마에서 기본 형식 상속을 나타내는 데 사용할 수 있습니다. 매핑 사양의 IsTypeOf<T> 표시기를 사용하면 기본 형식을 지정할 수 있으므로 중복되는 매핑 구문이 필요 없습니다.
다음 매핑 예제에서는 Customer
및 Person
형식에 대한 두 개의 별도 매핑을 보여 줍니다. EntityTypeMapping 요소의 ****TypeName 특성은 Person
과 Customer
형식을 구분합니다. 형식당 하나의 테이블이 있습니다. Customer
엔터티 형식 및 테이블에는 기본 형식에 포함되지 않은 NumYears
속성과 열이 포함됩니다.
<?xml version="1.0" encoding="utf-8"?>
<Mapping Space="C-S"
xmlns:cdm="urn:schemas-microsoft-com:windows:storage:mapping:CS"
xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
<EntityContainerMapping EntityContainerName="CNorthwind.LOBData">
<EntitySetMapping Name="Person1">
<EntityTypeMapping TypeName="CNorthwind.Person">
<MappingFragment StoreEntitySet="Person">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
<ScalarProperty Name="Name" ColumnName="Name" />
</MappingFragment>
</EntityTypeMapping>
<EntityTypeMapping TypeName="CNorthwind.Customer">
<MappingFragment StoreEntitySet="Customer">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
<ScalarProperty Name="Name" ColumnName="Name" />
<ScalarProperty Name="NumYears" ColumnName="NumYears" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
</EntityContainerMapping>
</Mapping>
참고 항목
작업
방법: 형식당 하나의 테이블 상속을 사용하여 모델 정의(Entity Framework)
방법: 계층당 하나의 테이블 상속을 사용하여 모델 정의(Entity Framework)