2012-10-26 6 views
4

다음 클래스가 있습니다. 도메인 모델은 엔터티 프레임 워크에 의해 만들어지며 POCO를 사용하고 있습니다.AutoMapper 복합 개체 매핑 - 목록 매핑

public class Customer 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public DateTime CreatedDate{ get; set; } 
    public DateTime ModifiedDate{ get; set; } 
    public virtual ICollection<Order> Orders{ get; set; } 
} 

public class CustomerDTO 
{ 

    public int Id { get; set; } 
    public string Name{ get; set; } 
    public List<OrderDTO> Orders{ get; set; } 
} 

public class Order 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int ProductId { get; set; } 
    public DateTime CreatedDate{ get; set; } 
    public DateTime ModifiedDate{ get; set; } 
} 

public class OrderDTO 
{ 
    public int Id { get; set; } 
    public string Name{ get; set; } 
} 

나는 다음과 같은 매핑을 시도했습니다.

Mapper.CreateMap<Customer, CustomerDTO>(); 
Mapper.CreateMap<CustomerDTO, Customer>(); 
Mapper.CreateMap<Order, OrderDTO>(); 
Mapper.CreateMap<OrderDTO, Order>(); 

가 나는 또한 내가 DB에서 검색하고 customerDTO

Customer customer = _customerRepository.GetById(customerDTO.Id); 
Mapper.Map<CustomerDTO, Customer>(customerDTO, customer); 

고객 객체로 업데이트 고객을 업데이트하려면

Mapper.CreateMap<CustomerDTO, Customer>().ForMember(c => c.Orders, 
      m => m.MapFrom 
      (
       q => Mapper.Map<List<OrderDTO>, ICollection<Order>>(q.Orders) 
      ) 
     ); 

을 시도 올바르게 업데이트되며, 생성 및 수정 된 날짜는 변경되지 않습니다. 그러나 주문 목록에있는 각 주문은 올바르게 업데이트되지 않습니다. productId, created 및 modified 날짜가 기본값으로 설정되고 데이터베이스에서 검색된 값은 설정되지 않습니다.

주문이 가상 컬렉션이기 때문에 다른 작업을해야합니까?

나는 자동 매퍼에 새로운 도움을 주셨다. 매핑되지 않은 회원들이 발견되었다 :

편집

나는 응용 프로그램 시작시 다음과 같은 오류를 수신

Mapper.AssertConfigurationIsValid(); 

을 추가했다. 아래 유형 및 회원을 검토하십시오. 사용자 지정 해결을 추가, 무시, 커스텀 매핑 식을 추가하거나

내가 내 매핑을 업데이트 소스/대상 유형 수정 :

Mapper.CreateMap<OrderDTO, Order>() 
       .ForMember(x => x.CreatedDate, y => y.Ignore()) 
       .ForMember(x => x.ModifiedDate, y => y.Ignore()) 
       .ForMember(x => x.ProductId, y => y.Ignore()) 

을하지만 주문은 여전히 ​​위의 속성을 덮어 데 기본 골짜기

+0

같은 문제!"Map"= Property 'Id'및 'UpdateDate'가 "CreateMap"이 정의 된대로 무시하는 대신 기본값으로 설정됩니다. 해결책을 찾았습니까 ?? – dataCore

답변

2

내가 올바른 또는 최적의 솔루션,하지만 당신의 매핑에 당신이 변경 시도 할 수는 확실하지 않다

q => Mapper.Map<List<OrderDTO>, ICollection<Order>>(q.Orders) 

q => Mapper.Map<List<OrderDTO>, ICollection<Order>>(q.Orders, c.Orders) 

에이 (고객 맵 유사) 주문을 무시하기보다는 업데이트해야합니다. 그것은 또한 단지에 충분해야

주 사용을 제외하고

q => Mapper.Map(q.Orders, c.Orders) 

: 또한

사소한 것, 내가 사람들에게 유사한 규칙을 사용하면 쉽게 매핑을 읽을 찾아 문서. For example :

// Configure AutoMapper 
Mapper.CreateMap<CalendarEvent, CalendarEventForm>() 
    .ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.EventDate.Date)) 
    .ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.EventDate.Hour)) 
    .ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.EventDate.Minute));