다음을 통해 공유


방법: 계층당 하나의 테이블 상속을 사용하여 모델 정의(Entity Framework)

이 항목에서는 계층당 하나의 테이블 상속을 사용하는 개념적 모델을 수동으로 만드는 방법을 설명합니다. 계층당 하나의 테이블 상속에서는 하나의 데이터베이스 테이블을 사용하여 상속 계층 구조에 있는 모든 엔터티 형식의 데이터를 유지 관리합니다.

Bb738443.note(ko-kr,VS.100).gif참고:
형식당 하나의 테이블 상속을 사용하여 모델을 정의하려면 ADO.NET Entity Data Model Tools를 사용하는 것이 좋습니다.자세한 내용은 Walkthrough: Mapping Inheritance - Table-per-Hierarchy을 참조하십시오.

계층당 하나의 테이블 상속을 사용하여 모델을 수동으로 정의하는 기본 단계는 다음과 같습니다.

  1. 기본 엔터티 형식과 파생 형식이 포함될 한 엔터티 집합을 개념적 모델에서 정의합니다. 자세한 내용은 EntitySet 요소(CSDL)를 참조하십시오.

  2. BaseType 특성을 사용하여 개념적 모델에서 파생 엔터티 형식을 정의하고 이러한 파생 형식에 대해 상속되지 않은 속성만 정의합니다. 자세한 내용은 EntityType 요소(CSDL)를 참조하십시오.

  3. 기본 형식과 파생 형식을 구분하는 데 사용할 값이 있는 열을 기본 데이터베이스 테이블에서 선택합니다. 예를 들어, Employee 테이블에 값이 정수인 EmployeeType 열이 있는 경우 Employee 기본 엔터티 형식이 HourlyEmployee 또는 SalariedEmployee라는 파생 엔터티 형식 중 하나이면 이 열의 값을 사용하여 구분할 수 있습니다. 자세한 내용은 다음 예제를 참조하십시오.

    판별자 열은 조건의 일부로 매핑되므로 계층 구조에 있는 모든 엔터티 형식에서 해당하는 속성이 없습니다. 이 규칙의 예외는 조건에서 Is Null 또는 Is Not Null 비교를 사용하는 경우입니다. 이 경우 판별자 열은 엔터티 형식에서 해당하는 속성이 있을 수 있습니다.

    판별자 열에 세 개 이상의 값이 포함될 수 있는 경우(예: 정수 형식) 판별자 열에는 null이 허용되거나 기본값이 포함되어야 합니다. 이렇게 하면 새 형식을 만들어 데이터베이스에 저장할 때 열이 null이거나 특정 값을 포함할 수 있습니다.

    계층 구조의 각 파생 형식을 매핑하는 데 조건을 사용해야 하며, 기본 형식을 매핑하는 데 조건을 사용할 수 있습니다. 기본 형식이 추상 형식이면 매핑이나 조건이 허용되지 않습니다.

  4. MSL(매핑 사양 언어)의 동일한 EntitySetMapping 요소에서 기본 엔터티 형식과 파생 형식을 매핑합니다. 적절한 경우 상속된 속성을 테이블 열에 매핑합니다. 파생 형식에서 TypeName 특성의 값을 설정할 때 IsTypeOf 구문을 사용합니다. 계층 구조의 형식을 구분하려면 매핑 조건을 사용합니다. 자세한 내용은 EntitySetMapping 요소(MSL)Condition 요소(MSL)를 참조하십시오.

다음 예제에서는 School 샘플 데이터베이스를 설치하고 Entity Framework 를 사용하도록 프로젝트를 수동으로 구성했다고 가정합니다. 자세한 내용은 School 샘플 데이터베이스 만들기(Entity Framework 퀵 스타트)Entity Framework 구성(Entity Framework 작업)을 참조하십시오.

저장소 모델을 만들려면

  1. 다음 XML 파일을 프로젝트에 추가하고 이름을 AdventureWorks.ssdl로 지정합니다.

    <?xml version="1.0" encoding="utf-8" ?>
    <Schema Namespace="AdventureWorksModel.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="AdventureWorksModelStoreContainer">
        <EntitySet Name="Product" EntityType="AdventureWorksModel.Store.Product"
                   store:Type="Tables" Schema="Production" />
      </EntityContainer>
      <EntityType Name="Product">
        <Key>
          <PropertyRef Name="ProductID" />
        </Key>
        <Property Name="ProductID" Type="int" Nullable="false"
                  StoreGeneratedPattern="Identity" />
        <Property Name="Name" Type="nvarchar" Nullable="false" MaxLength="50" />
        <Property Name="ProductNumber" Type="nvarchar" Nullable="false" MaxLength="25" />
        <Property Name="MakeFlag" Type="bit" Nullable="false" />
        <Property Name="FinishedGoodsFlag" Type="bit" Nullable="false" />
        <Property Name="Color" Type="nvarchar" MaxLength="15" />
        <Property Name="SafetyStockLevel" Type="smallint" Nullable="false" />
        <Property Name="ReorderPoint" Type="smallint" Nullable="false" />
        <Property Name="StandardCost" Type="money" Nullable="false" />
        <Property Name="ListPrice" Type="money" Nullable="false" />
        <Property Name="Size" Type="nvarchar" MaxLength="5" />
        <Property Name="SizeUnitMeasureCode" Type="nchar" MaxLength="3" />
        <Property Name="WeightUnitMeasureCode" Type="nchar" MaxLength="3" />
        <Property Name="Weight" Type="decimal" Precision="8" Scale="2" />
        <Property Name="DaysToManufacture" Type="int" Nullable="false" />
        <Property Name="ProductLine" Type="nchar" MaxLength="2" />
        <Property Name="Class" Type="nchar" MaxLength="2" />
        <Property Name="Style" Type="nchar" MaxLength="2" />
        <Property Name="ProductSubcategoryID" Type="int" />
        <Property Name="ProductModelID" Type="int" />
        <Property Name="SellStartDate" Type="datetime" Nullable="false" />
        <Property Name="SellEndDate" Type="datetime" />
        <Property Name="DiscontinuedDate" Type="datetime" />
        <Property Name="rowguid" Type="uniqueidentifier" Nullable="false" />
        <Property Name="ModifiedDate" Type="datetime" Nullable="false" />
      </EntityType>
    </Schema>
    

개념적 모델을 만들려면

  1. 다음 XML 파일을 프로젝트에 추가하고 이름을 AdventureWorks.csdl로 지정합니다. 다음 사항을 참고하십시오.

    • Products라는 한 엔터티 집합만 두 엔터티 형식 ProductDiscontinuedProduct에 대해 정의됩니다.

    • DiscontinuedProduct 엔터티 형식은 해당 정의에서 BaseType 특성이 나타내는 파생 형식입니다.

    • DiscontinuedProduct 엔터티 형식에 대해 정의된 속성은 상속되지 않는 속성뿐입니다.

    • 저장소 모델의 MakeFlag 열(위의 AdventureWorks.ssdl 파일 참조)은 기본 형식이나 파생 형식에서 속성으로 나타나지 않습니다. 이 열의 값은 조건의 일부로 매핑된 계층 구조의 형식을 구분하는 데 사용됩니다(아래의 AdventureWorks.msl 파일 참조).

    Bb738443.note(ko-kr,VS.100).gif참고:
    이 열이 Is Null 또는 Is Not Null 조건에서 사용되는 경우 해당 속성이 엔터티 형식에서 나타날 수 있습니다.

<?xml version="1.0" encoding="utf-8" ?>
<Schema Namespace="AdventureWorksModel" Alias="Self"
              xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation"
              xmlns="https://schemas.microsoft.com/ado/2008/09/edm">
  <EntityContainer Name="AdventureWorksEntities" annotation:LazyLoadingEnabled="true">
    <EntitySet Name="Products" EntityType="AdventureWorksModel.Product" />
  </EntityContainer>
  <EntityType Name="Product">
    <Key>
      <PropertyRef Name="ProductID" />
    </Key>
    <Property Type="Int32" Name="ProductID" Nullable="false" />
    <Property Type="String" Name="Name" Nullable="false" MaxLength="50"
              FixedLength="false" Unicode="true" />
    <Property Type="String" Name="ProductNumber" Nullable="false" MaxLength="25"
              FixedLength="false" Unicode="true" />
    <Property Type="Boolean" Name="FinishedGoodsFlag" Nullable="false" />
    <Property Type="String" Name="Color" MaxLength="15" FixedLength="false"
              Unicode="true" />
    <Property Type="Int16" Name="SafetyStockLevel" Nullable="false" />
    <Property Type="Int16" Name="ReorderPoint" Nullable="false" />
    <Property Type="Decimal" Name="StandardCost" Nullable="false"
              Precision="19" Scale="4" />
    <Property Type="Decimal" Name="ListPrice" Nullable="false"
              Precision="19" Scale="4" />
    <Property Type="String" Name="Size" MaxLength="5" FixedLength="false"
              Unicode="true" />
    <Property Type="String" Name="SizeUnitMeasureCode" MaxLength="3"
              FixedLength="true" Unicode="true" />
    <Property Type="String" Name="WeightUnitMeasureCode" MaxLength="3"
              FixedLength="true" Unicode="true" />
    <Property Type="Decimal" Name="Weight" Precision="8" Scale="2" />
    <Property Type="Int32" Name="DaysToManufacture" Nullable="false" />
    <Property Type="String" Name="ProductLine" MaxLength="2"
              FixedLength="true" Unicode="true" />
    <Property Type="String" Name="Class" MaxLength="2" FixedLength="true"
              Unicode="true" />
    <Property Type="String" Name="Style" MaxLength="2" FixedLength="true"
              Unicode="true" />
    <Property Type="Int32" Name="ProductSubcategoryID" />
    <Property Type="Int32" Name="ProductModelID" />
    <Property Type="DateTime" Name="SellStartDate" Nullable="false" />
    <Property Type="DateTime" Name="SellEndDate" />
    <Property Type="Guid" Name="rowguid" Nullable="false" />
    <Property Type="DateTime" Name="ModifiedDate" Nullable="false" />
  </EntityType>
  <EntityType Name="DiscontinuedProduct" BaseType="AdventureWorksModel.Product" >
    <Property Type="DateTime" Name="DiscontinuedDate" />
  </EntityType>
</Schema>

개념적 모델과 저장소 모델 간의 매핑을 정의하려면

  1. 다음 XML 파일을 프로젝트에 추가하고 이름을 AdventureWorks.msl로 지정합니다. 다음 사항을 참고하십시오.

    • ProductDiscontinuedProduct 엔터티 형식에 대한 매핑은 동일한 EntitySetMapping 요소에 정의됩니다.

    • DiscontinuedProduct의 상속된 속성은 기본 데이터베이스 테이블의 해당 열에 매핑됩니다.

    • IsTypeOf 구문은 파생된 DiscontinuedProduct 형식의 형식을 나타내는 데 사용됩니다.

    • 판별자 열 MakeFlag는 계층 구조의 각 엔터티 형식에 대한 Condition 요소에서 매핑됩니다.

    <?xml version="1.0" encoding="utf-8" ?>
    <Mapping Space="C-S" xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs">
      <EntityContainerMapping StorageEntityContainer="AdventureWorksModelStoreContainer"
                              CdmEntityContainer="AdventureWorksEntities">
        <EntitySetMapping Name="Products">
          <EntityTypeMapping TypeName="AdventureWorksModel.Product">
            <MappingFragment StoreEntitySet="Product">
              <ScalarProperty Name="ProductID" ColumnName="ProductID" />
              <ScalarProperty Name="ModifiedDate" ColumnName="ModifiedDate" />
              <ScalarProperty Name="rowguid" ColumnName="rowguid" />
              <ScalarProperty Name="SellEndDate" ColumnName="SellEndDate" />
              <ScalarProperty Name="SellStartDate" ColumnName="SellStartDate" />
              <ScalarProperty Name="ProductModelID" ColumnName="ProductModelID" />
              <ScalarProperty Name="ProductSubcategoryID" ColumnName="ProductSubcategoryID" />
              <ScalarProperty Name="Style" ColumnName="Style" />
              <ScalarProperty Name="Class" ColumnName="Class" />
              <ScalarProperty Name="ProductLine" ColumnName="ProductLine" />
              <ScalarProperty Name="DaysToManufacture" ColumnName="DaysToManufacture" />
              <ScalarProperty Name="Weight" ColumnName="Weight" />
              <ScalarProperty Name="WeightUnitMeasureCode" ColumnName="WeightUnitMeasureCode" />
              <ScalarProperty Name="SizeUnitMeasureCode" ColumnName="SizeUnitMeasureCode" />
              <ScalarProperty Name="Size" ColumnName="Size" />
              <ScalarProperty Name="ListPrice" ColumnName="ListPrice" />
              <ScalarProperty Name="StandardCost" ColumnName="StandardCost" />
              <ScalarProperty Name="ReorderPoint" ColumnName="ReorderPoint" />
              <ScalarProperty Name="SafetyStockLevel" ColumnName="SafetyStockLevel" />
              <ScalarProperty Name="Color" ColumnName="Color" />
              <ScalarProperty Name="FinishedGoodsFlag" ColumnName="FinishedGoodsFlag" />
              <ScalarProperty Name="ProductNumber" ColumnName="ProductNumber" />
              <ScalarProperty Name="Name" ColumnName="Name" />
              <Condition ColumnName="MakeFlag" Value="0" />
            </MappingFragment>
          </EntityTypeMapping>
          <EntityTypeMapping TypeName="IsTypeOf(AdventureWorksModel.DiscontinuedProduct)">
            <MappingFragment StoreEntitySet="Product">
              <ScalarProperty Name="ModifiedDate" ColumnName="ModifiedDate" />
              <ScalarProperty Name="rowguid" ColumnName="rowguid" />
              <ScalarProperty Name="SellEndDate" ColumnName="SellEndDate" />
              <ScalarProperty Name="SellStartDate" ColumnName="SellStartDate" />
              <ScalarProperty Name="ProductModelID" ColumnName="ProductModelID" />
              <ScalarProperty Name="ProductSubcategoryID" ColumnName="ProductSubcategoryID" />
              <ScalarProperty Name="Style" ColumnName="Style" />
              <ScalarProperty Name="Class" ColumnName="Class" />
              <ScalarProperty Name="ProductLine" ColumnName="ProductLine" />
              <ScalarProperty Name="DaysToManufacture" ColumnName="DaysToManufacture" />
              <ScalarProperty Name="Weight" ColumnName="Weight" />
              <ScalarProperty Name="WeightUnitMeasureCode" ColumnName="WeightUnitMeasureCode" />
              <ScalarProperty Name="SizeUnitMeasureCode" ColumnName="SizeUnitMeasureCode" />
              <ScalarProperty Name="Size" ColumnName="Size" />
              <ScalarProperty Name="ListPrice" ColumnName="ListPrice" />
              <ScalarProperty Name="StandardCost" ColumnName="StandardCost" />
              <ScalarProperty Name="ReorderPoint" ColumnName="ReorderPoint" />
              <ScalarProperty Name="SafetyStockLevel" ColumnName="SafetyStockLevel" />
              <ScalarProperty Name="Color" ColumnName="Color" />
              <ScalarProperty Name="FinishedGoodsFlag" ColumnName="FinishedGoodsFlag" />
              <ScalarProperty Name="ProductNumber" ColumnName="ProductNumber" />
              <ScalarProperty Name="Name" ColumnName="Name" />
              <ScalarProperty Name="ProductID" ColumnName="ProductID" />
              <ScalarProperty Name="DiscontinuedDate" ColumnName="DiscontinuedDate" />
              <Condition ColumnName="MakeFlag" Value="1" />
            </MappingFragment>
          </EntityTypeMapping>
        </EntitySetMapping>
      </EntityContainerMapping>
    </Mapping>
    

참고 항목

작업

방법: 형식당 하나의 테이블 상속을 사용하여 모델 정의(Entity Framework)

기타 리소스

고급 데이터 모델 정의(Entity Framework 작업)
CSDL, SSDL 및 MSL 사양