다음을 통해 공유


POCO 엔터티 사용(Entity Framework)

Entity Framework 에서는 사용자 지정 데이터 클래스 자체를 수정하지 않고도 데이터 모델과 함께 사용할 수 있습니다. 즉, 기존 도메인 개체 등의 POCO(Plain Old CLR Object)를 데이터 모델과 함께 사용할 수 있습니다. 데이터 모델에 정의된 엔터티에 매핑되는 이러한 POCO 데이터 클래스(지속성 무시 개체라고도 함)는 엔터티 데이터 모델 도구에서 생성된 엔터티 형식과 동일한 쿼리, 삽입, 업데이트 및 삭제 동작을 대부분 지원합니다.

매핑 요구 사항

POCO 엔터티를 데이터 모델과 함께 사용하려면 엔터티 형식의 이름이 사용자 지정 데이터 클래스와 동일해야 하며 엔터티 형식의 각 속성은 사용자 지정 데이터 클래스의 공용 속성에 매핑되어야 합니다. 형식 이름과 매핑되는 각 속성은 동일해야 합니다. 개념적 모델에서 엔터티를 수정하는 방법은 How to: Create and Modify Entity Types을 참조하십시오.

Dd456853.note(ko-kr,VS.100).gif참고:
사용자 지정 데이터 클래스에 어셈블리 수준의 EdmSchemaAttribute를 비롯한 매핑 특성이 적용된 경우에는 POCO 엔터티를 매핑할 수 없습니다.

POCO 템플릿을 사용하여 개념적 모델에서 지속성 무시 엔터티 형식을 생성할 수 있습니다. 이 템플릿은 Visual Studio에 포함되어 있지 않지만 Visual Studio Gallery에서 다운로드할 수 있습니다.

프록시 개체 만들기

POCO 클래스에 변경 내용이 발생할 때 Entity Framework 에서 해당 변경 내용을 추적하고 관련 개체의 지연 로드를 지원하도록 하려면 POCO 클래스가 POCO 프록시를 만들기 위한 요구 사항(Entity Framework) 항목에 설명된 요구 사항을 충족해야 합니다.

POCO 엔터티에 대한 프록시 개체를 만들 수 있는 경우 개체의 속성 값 및 그래프가 변경되면 해당 변경 내용이 Entity Framework 에 의해 자동으로 추적됩니다. 프록시를 사용하거나 사용하지 않는 변경 내용 추적 옵션에 대한 자세한 내용은 POCO 엔터티에서 변경 내용 추적(Entity Framework)을 참조하십시오.

POCO 엔터티와 프록시 엔터티 개체를 함께 사용할 수 있습니다. 프록시 개체를 만들지 않으려면 ObjectContextContextOptions 속성에서 반환된 ObjectContextOptions 인스턴스에서 ProxyCreationEnabled 속성 값을 false로 설정합니다.

' Disable proxy object creation. 
context.ContextOptions.ProxyCreationEnabled = False
// Disable proxy object creation.
context.ContextOptions.ProxyCreationEnabled = false;

자세한 내용은 방법: 프록시를 사용하여 POCO 엔터티 만들기(Entity Framework)를 참조하십시오.

POCO 프록시 serialize

DataContractSerializer는 알려진 형식만 serialize 및 deserialize할 수 있으며 프록시 형식은 알려진 형식이 아니므로 WCF(Windows Communication Foundation)에서는 프록시를 직접 serialize하거나 deserialize할 수 없습니다. POCO 엔터티를 serialize해야 하면 프록시를 만들지 않도록 설정하거나 ProxyDataContractResolver 클래스를 사용하여 프록시 개체를 원래 POCO 엔터티로 serialize합니다. 프록시를 만들지 않도록 설정하려면 ProxyCreationEnabled 속성을 false로 설정합니다.

ProxyDataContractResolver 클래스는 serialization 동안 프록시 형식을 POCO 형식에 매핑합니다. 서비스 작업에서 ProxyDataContractResolver 클래스를 사용하도록 DataContractSerializer에 지시하려면 내부적으로 ProxyDataContractResolver를 사용하여 프록시 형식을 순수한 POCO 형식에 매핑하는 특성 클래스(서비스 작업에 적용할 특성 클래스)를 정의합니다. 이 특성 클래스를 WCF 응용 프로그램의 서비스 계약에 포함된 메서드와 연결합니다.

클라이언트에서는 실제 POCO 엔터티를 받아 deserialize합니다. 이러한 클래스에는 프록시 개체의 지연 로드 및 변경 내용 추적 기능이 없습니다. 이러한 엔터티에서 계층 간에 변경 내용을 추적하려면 자동 추적 엔터티를 사용합니다. 자동 추적 엔터티는 Entity Framework 에 대한 종속성이 없으며 변경 내용 추적 논리를 자체적으로 포함하는 POCO 엔터티입니다. 자세한 내용은 연습: 자동 추적 엔터티 serialize(Entity Framework)를 참조하십시오.

자세한 내용은 연습: WCF를 사용하여 POCO 프록시 Serialize(Entity Framework)를 참조하십시오.

이진 serialization을 사용하여 프록시 개체를 serialize 및 deserialize할 수 있습니다. 그러나 AppDomain 경계를 벗어나서 개체 그래프를 serialize할 때는 대상 환경에 프록시 형식 정의가 있는지 확인해야 합니다. 해당 형식이 없으면 deserialization이 실패합니다. 형식이 있는지 확인하려면 CreateProxyTypes를 사용합니다.

Dd456853.note(ko-kr,VS.100).gif참고:
프록시 형식의 개체가 만들어지더라도 이 개체에는 프록시의 지연 로드 및 변경 내용 추적 기능이 없습니다.

이진 serialization과 데이터 계약 serialization을 사용할 경우 주 개체와 함께 관련 개체도 serialize됩니다. 지연 로드 기능은 액세스되는 각 관계 탐색 속성에 대한 쿼리를 수행하며, 이진 serializer와 WCF 데이터 계약 serializer는 둘 다 모든 관계 탐색 속성에 액세스합니다. 이로 인해 serialization 동안 예기치 않게 많은 쿼리가 수행될 수 있습니다. 프록시 형식을 생성하지 않고 지연 로드를 사용하지 않도록 설정하려면 다음 예제와 같이 지연 로드를 명시적으로 해제합니다.

' Disable lazy loading. 
context.ContextOptions.LazyLoadingEnabled = False
// Disable lazy loading.
context.ContextOptions.LazyLoadingEnabled = false;

자세한 내용은 개체 Serialize(Entity Framework)를 참조하십시오.

프록시 관련 API 요약

다음 API는 POCO 프록시를 사용하는 데 필요합니다.

멤버 설명

CreateObject

POCO 클래스가 POCO 프록시를 만들기 위한 요구 사항(Entity Framework) 항목에 설명된 요구 사항을 충족하고 ProxyCreationEnabledtrue로 설정되어 있으면 새 POCO 프록시 개체를 만들고, 그렇지 않으면 제네릭 인수 형식의 개체를 만듭니다. 이 메서드의 제네릭 인수는 구체적 참조 형식일 수 있습니다. 추상 클래스, 인터페이스 및 값 형식이 지원됩니다. 제네릭 형식이 개념적 모델에 매핑되지 않는 CLR 형식이거나 프록시 생성 요구 사항을 충족하지 않는 형식인 경우 이 메서드는 전달된 형식의 매개 변수 없는 생성자를 사용하여 해당 형식의 새 인스턴스를 만들고 반환하려고 합니다. ObjectContextCreateObject 외에도 ObjectSetCreateObjectCreateObject 메서드를 사용할 수 있습니다. 자세한 내용은 방법: 프록시를 사용하여 POCO 엔터티 만들기(Entity Framework)를 참조하십시오.

이 메서드는 만들어진 개체를 개체 컨텍스트에 추가하지 않습니다. 개체를 컨텍스트에 추가하려면 개체 만들기, 추가, 수정 및 삭제(Entity Framework) 항목에 설명된 메서드를 사용해야 합니다.

ProxyCreationEnabled

이 플래그가 true로 설정된 경우 Entity Framework에서는 POCO 엔터티에 대한 프록시를 만들려고 시도합니다. ProxyCreationEnabled 플래그는 기본적으로 true로 설정됩니다.

GetObjectType

System.Data.Objects.ObjectContext.GetObjectType(System.Type)은 프록시 형식이 인수로 전달된 경우 지정된 프록시가 파생된 원본 POCO 형식을 반환하는 정적 메서드입니다. 프록시가 아닌 형식이 전달된 경우 이 메서드는 동일한 형식을 반환합니다.

CreateProxyTypes

ObjectContext에 로드된 메타데이터에 따라 지정된 POCO 형식에 대한 프록시 형식 집합을 만듭니다. 이 메서드는 만들어진 프록시 형식의 개체를 인스턴스화하지 않습니다. 예를 들어 다음 코드에서는 CustomerOrder POCO 클래스에 대한 프록시를 만듭니다. context.CreateProxyTypes(new Type[] { typeof(Customer), typeof(Order) });

데이터 소스에서 개체를 로드하거나 CreateObject를 사용하여 새 개체를 만든 경우 Entity Framework에서는 런타임 동안 POCO 클래스에 대한 프록시 형식을 만듭니다. 그러나 프록시 형식을 미리 만들어 두어야 하는 경우도 있습니다. 예를 들어 AppDomain 경계를 벗어나서 개체 그래프를 serialize할 때 대상 환경에 프록시 형식이 실제로 있는지 확인해야 할 수 있습니다. 해당 형식이 없으면 deserialization이 실패합니다.

GetKnownProxyTypes

GetKnownProxyTypesAppDomain에서 지금까지 만들어진 모든 프록시 형식이 포함된 열거형을 반환하는 정적 메서드입니다. serialization 시나리오에서 이 메서드를 사용하여 대상 환경에 이미 포함되었어야 하고 serializer가 인식해야 하는 모든 형식을 가져올 수 있습니다.

단원 내용

POCO 프록시를 만들기 위한 요구 사항(Entity Framework)

관련 POCO 엔터티 로드(Entity Framework)

POCO 엔터티에서 변경 내용 추적(Entity Framework)

방법: POCO 엔터티 정의(Entity Framework)

방법: 사용자 지정 개체 컨텍스트 정의(Entity Framework)

방법: 사용자 지정 개체를 사용할 수 있도록 모델링 및 매핑 파일 사용자 지정(Entity Framework)

방법: 사용자 지정 개체 컨텍스트 정의(Entity Framework)

방법: 프록시를 사용하여 POCO 엔터티 만들기(Entity Framework)

방법: 명시적으로 POCO 엔터티 로드(Entity Framework)

방법: POCO 엔터티의 변경 내용 검색

방법: POCO 엔터티 간 관계 변경(Entity Framework)

ADO.NET의 POCO에 대한 블로그 게시물 시리즈는 다음과 같습니다.

POCO

Entity Framework 4의 POCO - 2부

Entity Framework 4의 POCO - 3부

참고 항목

개념

개체 사용자 지정(Entity Framework)
관계 정의 및 관리(Entity Framework)