2012-10-23 39 views
5

Tôi đã viết một kịch bản cha-con đơn giản và không thể làm cho nó được ánh xạ bằng Automapper. Trong kịch bản sau đây, tôi đang mong đợi danh sách các OrderItems được ánh xạ tới danh sách dtoOrderItems nhưng nó không xảy ra tự động. Tôi có cần phải viết thủ công bằng cách sử dụng cho vòng lặp hay cái gì đó?Làm thế nào để ánh xạ một mô hình bộ sưu tập cha/con bằng Automapper?

public class Order 
{ 
    public int OrderNumber {get; set;} 
    public List<OrderItem> OrderItems { get; set; } 

    public Order() 
    { 
     OrderItems = new List<OrderItem>(); 
     OrderItems.Add(new OrderItem() {Quantity= 10}); 
    } 
} 

public class OrderItem 
{ 
    public int Quantity {get; set;} 
} 

public class DTOOrder 
{ 
    public int DTOOrderNumber { get; set; } 
    public List<DTOOrderItem> DTOOrderItems { get; set; } 

    public DTOOrder() 
    { 
     DTOOrderItems = new List<DTOOrderItem>();   
    } 
} 

public class DTOOrderItem 
{ 
    public int DTOQuantity { get; set; } 
} 


public DTOOrder TestConversion() 
{ 
    AutoMapper.Mapper.CreateMap<OrderItem, DTOOrderItem>(); 
    AutoMapper.Mapper.CreateMap<Order, DTOOrder>(); 

    Order order = new Order();     
    var dtoOrder = AutoMapper.Mapper.Map<Order, DTOOrder>(order);   
    return dtoOrder; 
} 

Trả lời

4

Lý do bạn không có bộ sưu tập được ánh xạ là: một tên bộ sưu tập là OrderItems và một tên khác là DTOOrderItems. Các thuộc tính bản đồ tự động theo tên (Case sensitive) và không thể giải quyết vấn đề này.
Để giải quyết điều này:
1) Đổi tên DTOOrderItems (trong lớp DTO của bạn) để OrderItems
hoặc
2) lập bản đồ Override cho thuộc tính này sử dụng phương pháp ForMember từ Automapper API. Một cái gì đó như thế này:

AutoMapper.Mapper.CreateMap<Order, DTOOrder>() 
    .ForMember(o => o.OrderItems, dto => dto.DTOOrderItems) 

Cùng một vấn đề bạn sẽ có với số lượng và thuộc tính OrderNumber.

+4

Cảm ơn. Tôi đã phải làm như sau AutoMapper.Mapper.CreateMap (). ForMember (dto => dto.DTOOrderItems, opt => opt.MapFrom (src => src.OrderItems)); – user1767363

0

Bạn có thể viết chúng trong phương pháp mở rộng của mình, thay vì lặp trong mỗi trang, nó vẫn còn trong một trang duy nhất và bạn sẽ có thể sử dụng lại nó mà không có mã trùng lặp.

public static List<testMOdel> ToModelList(this List<testEntity> objlist) 
     { 
      List<testMOdel> list = new List<testMOdel>(); 
      foreach (var item in objlist) 
      { 
       list.Add((Mapper.Map<testEntity, testMOdel>(item))); 
      } 
      return list; 
     } 
     public static List<testEntity> ToEntityList(this List<testMOdel> modellist) 
     { 
      List<testEntity> list = new List<testEntity>(); 
      foreach (var item in modellist) 
      { 
       list.Add((Mapper.Map<testMOdel, testEntity>(item))); 
      } 
      return list; 
     } 
Các vấn đề liên quan