스키마(EDM)
EDM(엔터티 데이터 모델) 스키마는 엔터티 및 관계 형식을 정의하는 XML 텍스트 파일입니다. 또한 스키마는 이러한 형식의 인스턴스가 논리적으로 구성되는 컨테이너를 정의합니다. EDM의 엔터티와 연결은 엔터티 프레임워크와 함께 설치된 기본 형식과 개발자에 의해 디자인된 형식을 모두 정의합니다.
디자인 스키마는 CSDL(개념 스키마 정의 언어)로 작성됩니다. SSDL(저장소 스키마 정의 언어)로 작성되는 또 다른 스키마는 EDM을 사용하는 응용 프로그램의 저장소 모델을 정의합니다.
이 항목에서는 CSDL로 작성된 디자인 스키마를 설명합니다. 저장소 메타데이터 및 매핑 스키마에 대한 자세한 내용은 스키마 및 매핑 사양(Entity Framework)을 참조하십시오.
스키마의 최상위 요소는 이름 고유성 규칙이 적용되는 네임스페이스를 할당합니다. 간략한 형식의 다음 스키마에 정의된 형식은 MyCompany.LOBSchema
네임스페이스 아래에서 논리적으로 구성됩니다. 이 네임스페이스는 클래스 및 절차 코드가 포함된 개체 지향 프로그래밍의 네임스페이스와 비슷합니다. EDM에서는 프로시저를 정의하지 않습니다. EDM에서 프로시저를 구현하는 방법에 대한 자세한 내용은 도우미 메서드(EDM)를 참조하십시오.
다음 스키마에 정의된 각 엔터티와 연결에는 MyCompany.LOBSchema.Customer
와 같이 정규화된 이름이 있습니다. 이 예제에서는 정규화된 이름이 MyCompany.LOBSchema
네임스페이스에 대해 선언된 Self
별칭으로 축약되며 Self.Customer
와 같은 방법으로 사용됩니다.
엔터티와 연결은 스키마의 본문에 정의됩니다. 이 예제에서 정의한 엔터티의 속성은 CSDL 스키마의 전체 구조를 보여 주기 위해 생략되었습니다.
<?xml version="1.0" encoding="utf-8"?>
<Schema xmlns="https://schemas.microsoft.com/ado/2006/04/edm"
Namespace="MyCompany.LOBSchema" Alias="Self">
<Documentation>
<Summary>Conceptual schema (csdl)</Summary>
<LongDescription>This schema is an example showing
general syntax.</LongDescription>
</Documentation>
<EntityType Name="Customer">
<Key>
<PropertyRef Name="CustomerId" />
</Key>
<Property Name="CustomerId" Type="Guid" Nullable="false" />
<!-- Other properties-->
</EntityType>
<EntityType Name="Order">
<Key>
<PropertyRef Name="OrderId" />
</Key>
<Property Name="OrderId" Type="Guid" Nullable="false" />
<!-- Other properties-->
</EntityType>
<Association Name="Customer_Order">
<End Role="Customer" Type="Self.Customer" Multiplicity="0..1" />
<End Role="Order" Type="Self.Order" Multiplicity="*" />
</Association>
<EntityContainer Name="LOBSchemaData">
<EntitySet Name="Customers" EntityType="Self.Customer" />
<EntitySet Name="Orders" EntityType="Self.Order" />
<AssociationSet Name="Customer_Orders" Association="Self.Customer_Order">
<End Role="Customer" EntitySet="Customers" />
<End Role="Order" EntitySet="Orders" />
</AssociationSet>
</EntityContainer>
</Schema>
Using 태그를 사용하여 다른 CSDL 파일에 정의된 스키마에 대한 별칭을 정의할 수 있으므로 정규화된 구문을 사용하지 않고도 정의하고 있는 네임스페이스에서 외부 스키마의 기존 형식을 사용할 수 있습니다.
전체 스키마에서 엔터티 선언에는 속성이 포함됩니다. 속성 중 하나에는 Key 속성이 지정됩니다. EntityType의 Key 특성은 하나 이상의 엔터티 속성을 Key로 지정합니다. Key는 두 개 이상의 속성으로 구성된 복합 키일 수 있습니다. Key는 모든 작업에 대해 특정 엔터티의 인스턴스를 고유하게 식별합니다.
다음 예제의 열린 EntityType 태그 내에서 Name 특성이 엔터티에 대해 할당된 후 Key 특성에 CustomerId
가 할당됩니다. CustomerId
Key 속성의 Type 특성은 Key에 대한 고유 값을 지정하기 위해 Guid로 설정됩니다. 이 CSDL 세그먼트의 두 번째 줄에서 CustomerId
속성이 선언됩니다.
<EntityType Name="Customer" >
<Key>
<PropertyRef Name="CustomerId" />
</Key>
<Property Name="CustomerId" Type="Guid" Nullable="false" />
<Property Name="Title" Type="String" Nullable="false" />
</EntityType>
이 예제의 마지막 줄에서는 Title
속성을 선언하고 Title
속성의 Type을 String으로 지정합니다. Title
속성은 고객의 직책을 식별합니다. Title
속성은 Nullability="false"
제약 조건이 지정되어 있으므로 Null
일 수 없습니다. Title
속성의 String 형식 Default 특성은 "NewHire"
로 설정됩니다.
다음 예제와 같이 복합 키를 지정할 수 있습니다.
<EntityType Name="EmployeePayHistory">
<Key>
<PropertyRef Name="EmployeeID" />
<PropertyRef Name="RateChangeDate" />
</Key>
<Property Name="EmployeeID" Type="Int32" Nullable="false" />
<Property Name="RateChangeDate" Type="DateTime" Nullable="false"/>
<Property Name="Rate" Type="Decimal" Nullable="false"/>
<Property Name="PayFrequency" Type="Boolean" Nullable="false" />
<Property Name="ModifiedDate" Type="DateTime" Nullable="false" />
<NavigationProperty Name="Employee"
Relationship="Adventureworks.FK_EmployeePayHistory_Employee_EmployeeID"
FromRole="EmployeePayHistory" ToRole="Employee" />
</EntityType>
엔터티 컨테이너
EDM을 사용하는 스키마는 엔터티 컨테이너를 정의하여 정의하고 있는 네임스페이스에서 사용할 수 있는 데이터 형식 집합을 지정합니다. 엔터티 컨테이너는 CSDL 스키마를 기반으로 작성되는 프로그래밍 가능한 개체 모델의 네임스페이스를 위한 기본 요소입니다.
XML 계층 구조에서 EntityContainer 요소는 EntityContainer가 스키마에 정의되었더라도 Schema 요소와 별개입니다. 이는 EntityContainer를 저장소에 매핑할 때 중요한 내용입니다. 개념 스키마의 EntityContainer 태그는 저장소 메타데이터에 있는 해당 EntityContainer 태그에 매핑됩니다. 매핑 파일에서 EntityContainer의 정규화된 이름에는 스키마 네임스페이스 이름이 포함되지 않습니다.
엔터티 집합은 프로그래밍 가능한 개체 모델의 클래스를 모델링합니다. 연결 집합은 관계의 범위를 정의합니다. 엔터티 집합 및 연결 집합에 대한 자세한 내용은 엔터티 집합(EDM) 및 연결 집합(EDM)을 참조하십시오.
다음 스키마 세그먼트에는 MyCompany.LOBSchema
네임스페이스의 LOBSchemaData
네임스페이스에 대한 EntityContainer 선언이 있습니다.
<EntityContainer Name="LOBSchemaData">
<EntitySet Name="Customers" EntityType="Self.Customer"/>
<EntitySet Name="Orders" EntityType="Self.Order"/>
<AssociationSet Name="Customer_Orders"
Association="Self.Customer_Order">
<End Role="Customer" EntitySet="Customers"/>
<End Role="Order" EntitySet="Orders"/>
</AssociationSet>
</EntityContainer>
이 EntityContainer 선언에는 이전 코드 세그먼트에서 정의한 모든 엔터티 및 연결이 EntitySet 및 AssociationSet 태그에 지정된 집합 형태로 포함됩니다.
이 스키마의 사양을 데이터 형식으로 구현할 때 Customer
또는 Order
의 각 인스턴스는 해당 EntitySet의 멤버가 됩니다. 이 엔터티 컨테이너는 Customer
및 Order
엔터티 집합을 Customers
와 Orders
라는 복수형 이름을 지정하여 정의합니다. 개발자는 고유한 명명 규칙을 정의할 수 있습니다. 이름이 저장소 메타데이터 및 매핑 사양의 이름에 대응되는 방법에 대한 자세한 내용은 스키마 및 매핑 사양(Entity Framework)을 참조하십시오.
위의 EntityContainer 선언에서 AssociationSet 태그는 Customer_Orders
라는 연결 집합을 지정합니다. 이 연결 집합은 Customer_Order
연결의 인스턴스를 포함합니다.
이러한 요소(EntityType, EntitySet, Association, AssociationSet 및 EntityContainer)는 결합되어 스키마의 기본 구조를 형성합니다. 스키마의 선언에 대해 줄별로 설명하는 자세한 내용은 스키마 및 매핑 사양(Entity Framework)을 참조하십시오.
배포
EDM 사양은 CSDL에 엔터티 형식을 정의한 이후에 사용되는 저장소 모델을 지정하지 않습니다. 가장 일반적인 시나리오에서 데이터 소스는 RDBMS(관계형 데이터베이스 관리 시스템)입니다. 저장소 모델을 배포하려면 스키마에 정의된 엔터티에 해당하는 데이터베이스와 테이블을 만들어야 합니다. 또한 구현하는 과정에서는 연결을 지원하기 위해 데이터 테이블 및/또는 링크 테이블에 외래 키가 있어야 합니다.
데이터베이스와 테이블을 EDM 형식에 매핑하여 EDM을 기존 데이터베이스에 사용할 수 있습니다. 기존 프로그래밍 개체 모델 또한 EDM 형식에 매핑할 수 있습니다.
참고 항목
개념
엔터티 데이터 모델 관계
엔터티 데이터 모델 형식
EntityType 요소(CSDL)
EntitySet 요소(EntityContainer CSDL)
Association 요소(CSDL)
AssociationSet 요소(EntityContainer CSDL)
EntityContainer 요소(CSDL)