2012-12-20 1 views
0

Automapper를 사용하여 SQL 서버에서 자동으로 프로젝트를 만들려고합니다. 일부 데이터가 내 뷰 모델에 저장됩니다.Automapper를 통해 기본 ViewModel에 여러 시퀀스를 자동으로 생성합니다.

내가 가진보기 모델은 다음과 같습니다

public sealed class WorkstationViewModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string OccupiedByName { get; set; } 
} 

그리고 내가 사용하려고 해요 코드입니다 : 그들은 동일한 이름을 가지고

Mapper.CreateMap<Workstation, WorkstationViewModel>() 
    .ForMember(T => T.OccupiedByName, T => T.MapFrom(W => 
    W.Sessions.AsQueryable().Select(E => E.StaffMember.Name).SingleOrDefault())); 

두 속성 IdName 자동 전망이다 Workstation 클래스입니다. 나에게 automapper가를 생성 할 수 있다는 결론을 제공하는

나는이

var model = WorkstationsRepository.GetAll().Project() 
      .To<WorkstationViewModel>().SingleOrDefault(); 

같은 일부 codelines에 얻을 예외는 몇 가지 이상한 object reference is null 예외 스택 추적의 상단에 약간의 automapper의 CreateExpression<> 방법이 있습니다 그것을 SQL 코드로 변환하는 좋은 표현.

.Name에서 .Category.Name 또는 SQL 테이블의 다른 항목 검색과 같은 간단한 맵을 사용할 때 완벽하게 작동합니다. Automapper를 통해 시퀀스를 투영하는 동안 항목에 액세스하면됩니다.

답변

1

최신 Project().To() API는 "기존"Mapper.Map() API와 완전히 다른 경로를 사용합니다. 나는 후자가 당신의 경우에 달릴 것이라고 생각하지만, 당연히 프로젝션이 SQL에 대한 생각을 잠식하는 이점을 얻지 못할 것이다.

Project().To() 동안 AutoMapper는 람다 식을 만드는 데 사용하는 관련 유형에서 MemberInfo (반사)을 얻으려고합니다. 즉, 매핑의 소스 속성은 소스 유형의 멤버 여야합니다. 분명히 W.Sessions.AsQueryable().Select(...은 (은) Workstation의 회원이 아닙니다. AutoMapper 라인 어딘가에 null memberinfo에 충돌합니다.

따라서 Project().To()은 약간 제한되어 있습니다. 이 경우에는 Session의 부모와 WorkStationStaffMember을 모델에 매핑하는 방법이 있습니다. 참조 탐색 속성은 OK를 Project().To()으로 매핑합니다.