다음을 통해 공유


저장소 스키마에 개념적 모델 매핑

엔터티 프레임워크에서는 표 형식 데이터를 엔터티 형식으로 표현하여 개체 중심 뷰를 제공합니다. 따라서, 응용 프로그램 개발자는 개념적 모델을 기반으로 생성된 개체 모델에 대한 프로그래밍만 생각하면 되며 데이터베이스 개체에 액세스하여 이를 프로그래밍 개체로 변환하는 방법이나 데이터베이스 스키마에 대해서는 고려하지 않아도 됩니다. 엔터티 프레임워크에서는 모델 스키마 및 매핑을 사용하여 엔터티에 대한 생성, 읽기, 업데이트, 삭제 작업을 데이터 원본에 있는 동등한 작업으로 변환합니다.

Note참고

이 항목에 제시된 매핑 파일 일부는 모두 EDM 생성기(EdmGen.exe) 도구로 생성됩니다.

개념적 모델

개념적 모델은 EDM에서 엔터티 및 연결을 정의하는 EDM(엔터티 데이터 모델) 스키마입니다. 이 모델을 정의하는 XML 구문을 CSDL(개념 스키마 정의 언어)이라고 합니다. CSDL로 정의된 엔터티 형식은 각각 이름이 있으며 고유 식별 인스턴스에 대한 키뿐만 아니라 속성 집합도 가지고 있습니다. 속성에 할당된 데이터 형식은 단순 형식(스칼라 속성)이나 복합 형식(하나 이상의 스칼라 속성이나 복합 속성으로 구성)으로 지정됩니다. 추가 속성이 null 허용 여부를 지정하거나 기본값을 할당할 수 있습니다. 연결은 엔터티 사이의 관계를 정의합니다. 엔터티 프레임워크 언어 요소 및 용어에 대한 자세한 내용은 Entity Framework 용어를 참조하십시오.

다음 XML 조각에서는 다른 엔터티 및 연결은 제거된 상태에서 FK_Course_Department 연결을 통해 연관된 CourseDepartment 엔터티 형식을 정의하는 School EDM의 개념적 모델의 일부를 보여 줍니다.

<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="SchoolModel" Alias="Self" 
  xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
  <EntityContainer Name="SchoolEntities">
    <EntitySet Name="Course" EntityType="SchoolModel.Course" />
    <EntitySet Name="Department" EntityType="SchoolModel.Department" />
    ...
    <AssociationSet Name="FK_Course_Department" 
      Association="SchoolModel.FK_Course_Department">
      <End Role="Department" EntitySet="Department" />
      <End Role="Course" EntitySet="Course" />
    </AssociationSet>
    ...
  </EntityContainer>
  <EntityType Name="Course">
    <Key>
      <PropertyRef Name="CourseID" />
    </Key>
    <Property Name="CourseID" Type="Int32" Nullable="false" />
    <Property Name="Title" Type="String" Nullable="false" 
      MaxLength="100" Unicode="true" FixedLength="false" />
    ...
    <NavigationProperty Name="Department" 
      Relationship="SchoolModel.FK_Course_Department" 
      FromRole="Course" ToRole="Department" />
    ...
  </EntityType>
  <EntityType Name="Department">
    <Key>
      <PropertyRef Name="DepartmentID" />
    </Key>
    <Property Name="DepartmentID" Type="Int32" Nullable="false" />
    <Property Name="Name" Type="String" Nullable="false" MaxLength="50" 
      Unicode="true" FixedLength="false" />
    ...
    <NavigationProperty Name="Course" Relationship="SchoolModel.FK_Course_Department" 
      FromRole="Department" ToRole="Course" />
  </EntityType>
  ...
  <Association Name="FK_Course_Department">
    <End Role="Department" Type="SchoolModel.Department" Multiplicity="1" />
    <End Role="Course" Type="SchoolModel.Course" Multiplicity="*" />
  </Association>
  ...
</Schema>

저장소 모델

별개의 데이터 모델에서 SSDL(저장소 스키마 정의 언어)을 사용하여 일반적으로 관계형 데이터베이스에 저장되는 영구 데이터의 논리 모델을 설명합니다. SSDL 파일에 선언된 속성의 데이터 형식은 저장소 모델의 데이터 형식입니다. 이 저장소 모델 조각에서는 다른 엔터티는 제거된 상태에서 FK_Course_Department 외래 키를 통해 연관된 School 데이터베이스 CourseDepartment 테이블의 저장소 메타데이터 예제를 보여 줍니다.

<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="SchoolModel.Store" Alias="Self" 
  Provider="System.Data.SqlClient" ProviderManifestToken="2005"   xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"   xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
  <EntityContainer Name="dbo">
    <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" 
      store:Type="Tables" /> 
    <EntitySet Name="Department" 
      EntityType="SchoolModel.Store.Department" store:Type="Tables" />
     ...
    <AssociationSet Name="FK_Course_Department" 
      Association="SchoolModel.Store.FK_Course_Department">
      <End Role="Department" EntitySet="Department" />
      <End Role="Course" EntitySet="Course" />
    </AssociationSet>
    ...
  </EntityContainer>
  <EntityType Name="Course">
    <Key>
      <PropertyRef Name="CourseID" />
    </Key>
    <Property Name="CourseID" Type="int" Nullable="false" />
    <Property Name="Title" Type="nvarchar" Nullable="false" 
      MaxLength="100" />
    ...
  </EntityType>
  <EntityType Name="Department">
    <Key>
      <PropertyRef Name="DepartmentID" />
    </Key>
    <Property Name="DepartmentID" Type="int" Nullable="false" />
    <Property Name="Name" Type="nvarchar" Nullable="false" 
      MaxLength="50" />
    ...
  </EntityType>
  ...
  <Association Name="FK_Course_Department">
    <End Role="Department" Type="SchoolModel.Store.Department" 
      Multiplicity="1" />
    <End Role="Course" Type="SchoolModel.Store.Course" Multiplicity="*" />
    <ReferentialConstraint>
      <Principal Role="Department">
        <PropertyRef Name="DepartmentID" />
      </Principal>
      <Dependent Role="Course">
        <PropertyRef Name="CourseID" />
      </Dependent>
    </ReferentialConstraint>
  </Association>
  ...
</Schema>

매핑 사양

매핑 사양은 MSL(매핑 사양 언어)을 사용하여 개념적 모델에 선언된 형식을 저장소 모델에 선언된 데이터베이스 메타데이터에 연결합니다. 다음 MSL 조각에서는 School 모델의 CourseDepartment 엔터티에 대한 개념적 모델과 저장소 모델 간의 일대일 매핑을 보여 줍니다.

<?xml version="1.0" encoding="utf-8"?>
<Mapping Space="C-S" 
  xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
  <EntityContainerMapping StorageEntityContainer="dbo" 
    CdmEntityContainer="SchoolEntities">
    <EntitySetMapping Name="Course">
      <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Course)">
        <MappingFragment StoreEntitySet="Course">
          <ScalarProperty Name="CourseID" ColumnName="CourseID" />
          <ScalarProperty Name="Title" ColumnName="Title" />
          ...
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
    <EntitySetMapping Name="Department">
      <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Department)">
        <MappingFragment StoreEntitySet="Department">
         <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
          <ScalarProperty Name="Name" ColumnName="Name" />
          ...
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
    ...
    <AssociationSetMapping Name="FK_Course_Department" 
      TypeName="SchoolModel.FK_Course_Department" 
      StoreEntitySet="Course">
      <EndProperty Name="Department">
        <ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
      </EndProperty>
      <EndProperty Name="Course">
        <ScalarProperty Name="CourseID" ColumnName="CourseID" />
      </EndProperty>
      <Condition ColumnName="DepartmentID" IsNull="false" />
    </AssociationSetMapping>
    ...
  </cs:EntityContainerMapping>
</Mapping>

추가 설명

여기서 설명한 School 모델에서는 개념적 엔터티와 데이터베이스 테이블 간의 단순 일대일 매핑을 사용하지만, 엔터티 프레임워크에서는 더 복잡한 매핑이 지원됩니다. 예를 들어, 관계형 데이터베이스에서 개별 직원 관련 데이터를 저장하는 데 테이블을 두 개 이상 사용할 수 있습니다. 한 테이블에는 모든 사람의 연락처 정보가 포함되고, 별개의 관련 테이블에는 직원과만 관련된 정보가 포함될 수 있습니다. 엔터티 프레임워크에서 개발자는 상속 계층 구조를 정의할 수 있고 한 엔터티를 데이터베이스 테이블 한 개 이상의 데이터에 매핑할 수 있으며, 이때 데이터 업데이트, 삽입, 삭제가 완전히 지원됩니다. 자세한 내용은 Entity Framework의 데이터 모델링을 참조하십시오.

참고 항목

개념

Entity Framework 용어

기타 리소스

시작(Entity Framework)
EDM 사양
고급 데이터 모델 정의(Entity Framework 작업)
스키마 및 매핑 사양(Entity Framework)