2013-07-24 2 views
4

나는 AutoMapper를 사용하고 있는데, "Include()"절에서 지정하지 않아도 모든 하위 엔티티를 가져옵니다. 게으른 로딩을 가능하게하고, 지정했을 경우에만 자식 속성을 얻는 방법이 있습니까? automapper는 EF로 지연로드를 방지합니까?

내가 가장 좋은 방법은 당신의 필요에 따라 매핑 객체를 정의하는 것입니다 생각,

야쿱

답변

8

매핑 후에는 원본 엔티티 (지연 엔티티에 대한 데이터베이스 컨텍스트를 보유하고 있음)에 대한 참조없이 객체를 매핑합니다. 속성 값만 대상 엔터티에 복사됩니다. 따라서 소스 엔터티가없는 경우 지연로드를 수행 할 수 없습니다..

실제로 게으른 로딩은 잘 작동하며 매핑 프로세스 중에 발생합니다. 엔티티의 지연로드 속성에 대한 매핑을 지정했으며 매퍼는 해당 값을 가져 오려고합니다. 결과적으로 매핑을 위해 구성한 모든 탐색 속성을 지연로드합니다. 이것은 매우 비효율적입니다. 매핑하는 동안 지연로드를 사용하지 않으려면 매핑 구성에서 탐색 속성을 무시하면됩니다. 예 : 대상 엔티티 CustomerDto에서

Mapper.CreateMap<Customer, CustomerDto>() 
     .ForMember(s => s.Orders, m => m.Ignore()); 

또는 제거 Orders 재산 : 당신은 게으른로드 주문과 고객이있는 경우. 내부에 주문이 CustomerDto 인 인스턴스가 있어야하는 경우 최상의 옵션은 추가 쿼리를 피하기 위해 열심히 주문을로드하는 것입니다.

+1

안녕하세요, 제가 생각하기에 가장 좋은 방법입니다. 고맙습니다 –

2

을 주셔서 감사합니다. 매핑 개체에서 필요한 자식 엔터티 만 정의하십시오. 도메인의 Person 엔터티에이 매핑과 같은 일부 DTO를 예로 들어 보겠습니다.

class PersonDto 
{ 
    public string Name{get;set;} 
    public PersonLiteDto Parent{get; set;} 
} 

class PersonLiteDto 
{ 
    public string Name{get;set;} 
    //no navigation properties here.. 
} 
+0

의견을 보내 주셔서 감사합니다. –

+0

나는 평범한 것에서 빛으로 바뀌고 다시 돌아가고 싶다면 automappers cache가 정말 어렵다고 동의한다. Mapper.Reset()을 사용하고 모든 매핑을 다시 수행해야합니다. 처음에는 이러한 문제를 일으키지 않는 오토 데스크 용으로 더 나은 솔루션이 될 수 있지만 더 나은 솔루션입니다. –

+0

PersonDto를 PersonLiteDto에서 상속받는 것이 더 좋습니다. –

관련 문제