2012-01-14 3 views
8

나는 그렇지 않거나 작동하지 않습니다 ... 저는 서로 상속하는 여러보기에 매핑하려는 단일 소스 클래스가 있습니다.Automapper 2.0의 Include 기능을 올바르게 사용하고 있습니까?

기본적으로 기본 클래스는 세부 정보이며 하위 클래스는 세부 정보와 동일한 데이터를 모두 사용하는 수정 또는 업데이트이며 자체 목록을 관리하기위한 몇 가지 다른 필드가 있습니다. 여기

내가 사용하고지도입니다 : I Mapper.Map (티켓) MapFrom를 사용하는 특성의 평가되지 않는 경우

그런 다음
Mapper.CreateMap<Ticket, Detail>() 
       .Include<Ticket, Update>() 
       .Include<Ticket, Edit>() 
       .ForMember(dest => dest.Priority, opt => opt.MapFrom(src => src.Priority.Code)) 
       .ForMember(dest => dest.TicketID, opt => opt.MapFrom(src => src.ID)) 
       .ForMember(dest => dest.Status, opt => opt.MapFrom(src => src.StatusCode)) 
       .ForMember(dest => dest.Category, opt => opt.MapFrom(src => src.ProblemCategoryCode)) 
       .ForMember(dest => dest.crmBusCode, opt => opt.MapFrom(src => src.Company.crmBusCode)) 
       .ForMember(dest => dest.TeamMembers, opt => opt.MapFrom(src => src.Schedules.Where(s => s.CompleteTime == null))); 

      Mapper.CreateMap<Ticket, Update>() 
       .ForMember(m => m.Schedules, opt => opt.MapFrom(t => t.Schedules.Where(s => s.EmployeeID == Util.CurrentUserID() && s.CompleteTime == null))); 

      Mapper.CreateMap<Ticket, Edit>(); 

, 그들은 단지 값으로 결국 그들은 설정된 매핑이 없으면 가져 왔습니다.

여기에 무슨 문제가 있습니까?

+0

어떤 Automapper 버전을 사용하고 있습니까? – nemesv

+0

버전 2.0을 사용 중입니다. – CodeRedick

답변

7

를 대체 솔루션으로 당신이 Mapper.Map 두 번 호출하지 않으려면.

public static class MappingExtensions 
{ 
    public static IMappingExpression<Ticket, TDest> MapDetailProperties<TDest>(
     this IMappingExpression<Ticket, TDest> mapBase) where TDest : Detail 
    { 
     return mapBase 
      .ForMember(dest => dest.Priority, 
       opt => opt.MapFrom(src => src.Priority.Code)) 
      ///.... 
      .ForMember(dest => dest.TeamMembers, 
       opt => opt.MapFrom(src => src 
        .Schedules.Where(s => s.CompleteTime == null))); 
    } 
} 

을 그리고 Ticket -> UpdateTicket -> Edit 매퍼 등록 할 때 그 확장 방법을 사용하십시오 : 당신은 확장 메서드에 Detail의 일반적인 매핑을 이동할 수 있습니다

Mapper.CreateMap<Ticket, Update>() 
    .MapDetailProperties() 
    .ForMember(m => m.Schedules, opt => opt.MapFrom(t => t.Schedules 
     .Where(s => s.EmployeeID == Util.CurrentUserID() && 
      s.CompleteTime == null))); 

Mapper.CreateMap<Ticket, Edit>() 
    .MapDetailProperties(); 

그럼 당신은 일반적으로지도를 사용할 수 있습니다

Ticket ticket = new Ticket();  
var edit = Mapper.Map<Ticket, Edit>(ticket); 
var update = Mapper.Map<Ticket, Update>(ticket); 
+1

조금 더 많은 작업이 있지만 꼭가는 올바른 방법 인 것 같습니다! 기본적으로 Include가 기본적으로이 확장 메소드처럼 작동하는 것이 더 합리적이라고 생각하는 유일한 사람입니까? – CodeRedick

+0

내 비슷한 문제에 대한 해결책은 이것과는 조금 다르지만 정적 확장 메서드의 핵심 개념을 사용합니다. 나는 AutoMapper가 이것을 즉시 지원할 수 있었으면 좋겠다. –

5

Automapper 2.0의 Include 기능을 올바르게 사용하고 있습니까?

아니오 - 당신이 .Include를 사용하는 경우, AutoMapper 대상 클래스 (이 here을 더 논의된다) 소스 클래스와 유사한 계층 구조에있는 것으로 기대합니다. 즉, Ticket에서 Detail까지 다른 서브 클래스로 매핑하는 경우 UpdateEdit 일 때 Include이 적합합니다.

귀하의 경우에는 도움이되지 않습니다. .Map의 오버로드를 사용하여 기존 개체를 가져 와서 수정하는 것이 좋습니다. 그런 식으로, 당신은 단지 기본 유형에 대한 매핑을 정의 할 수 있습니다

Ticket ticket = new Ticket(); 
Edit edit = new Edit(); 

Mapper.Map<Ticket, Detail>(ticket, edit); 
// Edit has now been automapped using the base mapping. 

Mapper.Map<Ticket, Edit>(ticket, edit); 
// The properties unique to Edit have now been mapped. 
관련 문제