2012-10-23 15 views
5

Napisałem prosty scenariusz rodzic-dziecko i nie mogę go zmapować za pomocą Automapper. W poniższym scenariuszu oczekuję, że lista Elementów zamówienia zostanie zmapowana do listy dtoOrderItems, ale nie dzieje się to automatycznie. Czy muszę napisać to ręcznie za pomocą pętli for lub co?Jak zmapować model kolekcji rodzic/dziecko za pomocą 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; 
} 

Odpowiedz

4

Powodem nie dostaniesz zbiory odwzorowany jest: jedna nazwa kolekcji jest OrderItems a inny jest DTOOrderItems. Automapper mapuje właściwości według nazwy (Case sensitive) i nie może tego rozwiązać.
Aby rozwiązać ten problem:
1) Zmiana nazwy DTOOrderItems (w klasie DTO) do OrderItems
lub
2) mapowanie zastąpienia dla tej właściwości, stosując metodę ForMember z Automapper API. Coś takiego:

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

Ten sam problem masz z Ilość i właściwości numer zamówienia.

+4

Dzięki. Musiałem wykonać następujące AutoMapper.Mapper.CreateMap (). ForMember (dto => dto.DTOOrderItems, opt => opt.MapFrom (src => src.OrderItems)); – user1767363

0

Możesz napisać to w swojej metodzie rozszerzenia, zamiast zapętlać się na każdej stronie, pozostaje na jednej stronie i będziesz mógł go użyć ponownie bez duplikatu kodu.

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; 
     } 
Powiązane problemy