2013-11-14 2 views
1

모델에 지정된 엔터티 형식에서 파생 된 자신의 클래스 인스턴스를 구체화 할 수있는 방법이 있습니까? 주어진 엔티티에 대한 모델에 "ClassName"속성이 있고 EF가 엔티티의 인스턴스를 구체화 할 때마다 대신 지정된 ClassName의 인스턴스를 만들고 싶습니다 (물론 엔티티의 하위 클래스 임) .Entity Framework 6에서 엔터티 구체화 사용자 지정

ObjectContext에 ObjectMaterialized 이벤트가 있지만이 시점에서 엔티티가 이미 생성되어 있다는 것을 알고 있습니다.

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
objectContext.ObjectMaterialized += OnObjectMaterialized; 

오브젝트 생성을 사용자 정의하기 전에 바로 연결해야합니다. 당신은 지구상에서 왜 이것을해야하는지 물을 수 있습니다. 나는 지속적으로 변화하는 대형 객체 모델을 가지고있어서 EDMX에서 모든 클래스를 정의 할 수 없다. 데이터베이스에 저장 한 속성은 개체 모델 계층의 맨 위에있는 두 클래스로 추상화 할 수 있습니다. 유형별 테이블 상속을 사용하는 엔티티를 작성하려고합니다. 하지만 EF를 사용할 때 특정 객체 인스턴스를 직접 검색 할 수 있다면 정말 좋을 것입니다.

감사합니다.

+1

질문에 대한 답변이 아니지만 생성 된 엔티티 클래스는 부분적입니다. 단순히 부분 클래스에 필요한 기능을 추가 할 수 없습니까? – oerkelens

+0

@oerkelens의 덧글에 추가하려면 확장 클래스를 사용할 수도 있습니다. 클래스 생성에 변화가있을 때 세대를 망칠 수 있습니다. – ESG

+0

부분 클래스를 통해 메서드 또는 속성을 추가하는 것으로 충분하지 않습니다. 엔티티 클래스에서 상속을 사용하여 전체 개체 모델을 만들어야합니다. –

답변

1

저는 사용자 정의 프록시를 만들고 엔터티 프레임 워크 깊숙히 디버깅하려고했습니다. 나는 트랜 슬레이터 클래스를 발견했다. 이것은 리플렉션에 의해 엔티티를 생성 할 책임이있다. 클래스의 네임 스페이스는 입니다. System.Data.Entity.Core.Common.Internal.Materialization입니다.

entites를 만드는 방법은 개인 메서드 Emit_ConstructEntity입니다. 엔터티 형식은 매개 변수이며 개인 메서드 에 의해 만들어집니다. LookupObjectMapping (모델을 먼저 사용하고있었습니다) EdmType 개체를 기반으로합니다.

생성 된 클래스를 변경하려면 사용자 정의 MetaDataWorkspace를 만들어야합니다. 작업 공간은 EdmType을 선택해야합니다. 메소드 내에서 직접 디버깅을 시도하고 CLR 유형을 식별하는 데 MetaDataWorkspace가 어떻게 사용되는지 살펴보십시오.

관련 문제