방법: 복합 형식으로 모델 정의(Entity Framework)

EDM(엔터티 데이터 모델)의 복합 형식은 키 속성이 없는 내부 구조를 가지는 데이터 형식입니다. 복합 형식은 고유한 내부 속성을 가진 속성을 구현하는 데 사용됩니다. 엔터티 또는 복합 형식은 복합 형식으로 선언된 속성을 가질 수 있습니다.

복합 형식은 엔터티 형식과 비슷한 구문으로 선언됩니다. 주된 차이점은 복합 형식에는 엔터티와 같은 키 속성 선언이 포함되지 않는다는 점입니다. 매핑 사양에서 복합 형식은 복합 속성으로 매핑됩니다.

복합 속성을 구현하려면

  1. Visual Studio에서 클래스 라이브러리 형식의 프로젝트를 만들고 System.Data.EntitySystem.Runtime.Serialization에 대한 참조를 추가합니다.

  2. 프로젝트에 새 엔터티 데이터 모델 템플릿을 추가합니다.

  3. CSDL(개념 스키마 디자인 언어) 스키마를 구현한 다음 EDM 템플릿에서 제공하는 CSDL 파일에 추가합니다. 스키마에는 CCustomer 엔터티와 복합 형식 CAddress를 사용하는 해당 Address 속성의 선언이 포함됩니다. 전체 스키마는 아래 예제 코드에서 볼 수 있습니다.

  4. 2단계에서 만든 개념 스키마에서 edmgen.exe를 실행하여 개체 코드를 만듭니다.

  5. SSDL(저장소 스키마 정의 언어) 스키마를 구현한 다음 EDM 템플릿에서 제공하는 SSDL 파일에 추가합니다. 아래의 SSDL(저장소 스키마 디자인 언어) 메타데이터에서 볼 수 있듯이, 이 스키마에서 복합 형식 데이터는 포함 엔터티와 동일한 테이블에 저장됩니다. 전체 스키마는 아래 예제 코드에서 볼 수 있습니다.

  6. MSL(매핑 사양 언어) 스키마를 구현한 다음 EDM 템플릿에서 제공하는 MSL 파일에 추가합니다. 아래의 매핑 스키마에서는 Address를 복합 속성으로 매핑합니다. 전체 매핑 사양은 아래 예제 코드에서 볼 수 있습니다.

예제

다음 XML에서 세 개의 필수 스키마를 모두 볼 수 있습니다. 코드 뒤에 제공된 스크립트를 사용하면 이 예제에서 저장소로 사용되는 데이터베이스를 만들 수 있습니다.

    <Schema Namespace="CustomerComplexAddress"
        Alias="Self"
        xmlns="https://schemas.microsoft.com/ado/2006/04/edm">

        <EntityContainer Name="CustomerComplexAddressContext">
          <EntitySet Name="CCustomers" EntityType="CustomerComplexAddress.CCustomer" />
        </EntityContainer>

        <EntityType Name="CCustomer">
          <Key>
            <PropertyRef Name="CustomerId" />
          </Key>
          <Property Name="CustomerId" Type="Int32" Nullable="false" />
          <Property Name="CompanyName" Type="String" />
          <Property Name="ContactName" Type="String" />
          <Property Name="ContactTitle" Type="String" />
          <Property Name="Address" Type="Self.CAddress" Nullable="false" />
        </EntityType>

        <ComplexType Name="CAddress">
          <Property Name="StreetAddress" Type="String" />
          <Property Name="City" Type="String" />
          <Property Name="Region" Type="String" />
          <Property Name="PostalCode" Type="String" />
          <Property Name="Country" Type="String" />
          <Property Name="Phone" Type="String" />
          <Property Name="Fax" Type="String" />
        </ComplexType>
    </Schema>

    <Schema Namespace="CustomerComplexAddress.Store"
        Alias="Self" Provider="System.Data.SqlClient"
        ProviderManifestToken="2005"
        xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">

        <EntityContainer Name="dbo">
          <EntitySet Name="SCustomer" EntityType="CustomerComplexAddress.Store.SCustomer" />
        </EntityContainer>

        <EntityType Name="SCustomer">
          <Key>
            <PropertyRef Name="CustomerId" />
          </Key>
          <Property Name="CustomerId" Type="int" Nullable="false" />
          <Property Name="CompanyName" Type="nvarchar" MaxLength="50" />
          <Property Name="ContactName" Type="nvarchar" MaxLength="50" />
          <Property Name="ContactTitle" Type="nvarchar" MaxLength="50" />
          <Property Name="Address" Type="nvarchar" MaxLength="50" />
          <Property Name="City" Type="nvarchar" MaxLength="50" />
          <Property Name="Region" Type="nvarchar" MaxLength="50" />
          <Property Name="PostalCode" Type="nvarchar" MaxLength="50" />
          <Property Name="Country" Type="nvarchar" MaxLength="50" />
          <Property Name="Phone" Type="nvarchar" MaxLength="50" />
          <Property Name="Fax" Type="nvarchar" MaxLength="50" />
        </EntityType>
    </Schema>

    <Mapping Space="C-S"
        xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">

        <EntityContainerMapping StorageEntityContainer="dbo"
                  CdmEntityContainer="CustomerComplexAddressContext">

          <EntitySetMapping Name="CCustomers">
            <EntityTypeMapping
                 TypeName="CustomerComplexAddress.CCustomer">
              <MappingFragment StoreEntitySet="SCustomer">
                <ScalarProperty Name="CustomerId"
                                  ColumnName="CustomerId" />
                <ScalarProperty Name="CompanyName"
                                  ColumnName="CompanyName" />
                <ScalarProperty Name="ContactName"
                                  ColumnName="ContactName" />
                <ScalarProperty Name="ContactTitle"
                                  ColumnName="ContactTitle" />
               <ComplexProperty Name="Address"
                       TypeName="CustomerComplexAddress.CAddress">
                 <ScalarProperty Name="StreetAddress"
                                  ColumnName="Address" />
                 <ScalarProperty Name="City" ColumnName="City" />
                 <ScalarProperty Name="Region" ColumnName="Region" />
                 <ScalarProperty Name="PostalCode"
                                  ColumnName="PostalCode" />
                 <ScalarProperty Name="Country" ColumnName="Country" />
                 <ScalarProperty Name="Phone" ColumnName="Phone" />
                 <ScalarProperty Name="Fax" ColumnName="Fax" />
                </ComplexProperty>
              </MappingFragment>
            </EntityTypeMapping>
          </EntitySetMapping>
       </EntityContainerMapping>
    </Mapping>


The following script can be used to create
    SQL Server storage model.

USE [master]
GO

CREATE DATABASE [CustomerComplexAddress] 
GO

USE [CustomerComplexAddress]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'[dbo].[SCustomer]') 
AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[SCustomer](
    [CustomerId] [int] NOT NULL,
     [CompanyName] [nvarchar](50) NULL,
     [ContactName] [nvarchar](50) NULL,
     [ContactTitle] [nvarchar](50) NULL,
    [Address] [nvarchar](50) NULL,
     [City] [nvarchar](50) NULL,
     [Region] [nvarchar](50) NULL,
     [PostalCode] [nvarchar](50) NULL,
     [Country] [nvarchar](50) NULL,
     [Phone] [nvarchar](50) NULL,
     [Fax] [nvarchar](50) NULL,
CONSTRAINT [PK_SCustomer] PRIMARY KEY CLUSTERED 
(
     [CustomerId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
   IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, 
   ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO

참고 항목

작업

방법: 복합 형식으로 개체 쿼리 만들기 및 실행(Entity Framework)
방법: 복합 형식으로 개체 추가 및 수정(Entity Framework)

개념

복합 형식(EDM)