2011-12-06 1 views
2

포크, 내 서비스 계층에서 automapper를 사용하여 EF 객체를 간단한 Pocos로 매핑합니다. EF에는 많은 관계가있는 특정 엔티티가 있지만이 중 얼마가 db에서 다시 가져 오는 지 제한하려고합니다. 이러한 엔터티 중 하나는 데이터베이스 테이블에 매핑되지만 생성 된 모델 (EDMX)에서 엔터티 컬렉션으로 나타나는 다른 테이블과 많은 관계가 있습니다.EF 엔티티 유형을 자동 매핑하는 동안 지연로드를 제한합니다.

그래서 필자는 엔티티의 첫 번째 수준 속성 (즉, 연관된 컬렉션/엔티티 컬렉션 대신 정수 ID)에 대한 poco 속성 만있는 엔티티의 "얕은"poco를 만들었습니다. 나는 단지 여기에 간단한 마시고에 엔티티를 매핑하고 있기 때문에 나는 EF 시도 및 기타 비 참조 데이터를 쿼리하지 않을 것이라는 확신 할 수 있습니다 ..

var simplepocoforentity= Mapper.Map(_readOnlyDb.Single<EfEntity>(x => x.Id== Id), 
            new SimplPocoForEntity()); 

내 질문은 .... 다음과 같은 방식으로지도 매핑 할 때 기본 db 테이블 관계에서?

SQL 프로파일 링을 통해이 문제를 조사 할 수 있음을 알고 있습니다 만,이 경로를 따라가는 입력에 대해서는 감사하겠습니다. 감사합니다. K.

답변

2

AutoMapper의 내부 구현에 따라 다릅니다. AutoMapper가 엔터티의 탐색 속성에 액세스하려고 시도하지 않는다고 가정합니다 (이 경우 지연로드 및 추가 데이터베이스 쿼리가 시작됩니다). 스칼라 속성 만 매핑하는 경우 AutoMapper가이 작업을 수행해야하는 이유가 없습니다. 보조 노트로

try 
{ 
    _readOnlyDb.ContextOptions.LazyLoadingEnabled = false; 

    var simplepocoforentity = Mapper.Map(_readOnlyDb.Entities 
     .Single(x => x.Id == Id), new SimplPocoForEntity()); 

    // ... 
} 
finally 
{ 
    _readOnlyDb.ContextOptions.LazyLoadingEnabled = true; 
} 

:하지만 누가 당신이 안전을하려면

가 일시적으로 지연로드를 비활성화 할 수 ... 알고 당신이 컨텍스트에 전체 개체를로드하는 것이주의 이 접근법. 그 후 매핑이 발생합니다. 잠재적으로 데이터베이스에서 더 많은 열을 실제로로드합니다 (여기서는 특별한 경우가 아닐 수 있습니다).

var simplepocoforentity = _readOnlyDb.Entities 
    .Where(e => e.Id == Id) 
    .Select(e => new SimplPocoForEntity 
    { 
     PocoProperty1 = e.EntityProperty1, 
     PocoProperty2 = e.EntityProperty2, 
     PocoProperty3 = e.EntityProperty3 
     // etc. 
    }) 
    .Single(); 
이 방법으로

당신이 개체를로드하지 않기 때문에 더 게으른 로딩이 전혀 일어나지 않을 것입니다하지만 직접 : 일반적으로 나는 데이터베이스는 필요한 열을 쿼리 보장 투사로 매핑 할 것 PocoForEntity 데이터베이스에서.