2012-10-23 16 views
5

Ho scritto un semplice scenario genitore-figlio e non riesco a farlo mappare usando Automapper. Nel seguente scenario, mi aspetto che l'elenco di OrderItem sia mappato alla lista di dtoOrderItems ma non si verifichi automaticamente. Devo scriverlo manualmente usando il ciclo for o qualcosa del genere?Come mappare un modello di raccolta genitore/figlio usando 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; 
} 

risposta

4

Il motivo non si ottiene collezioni mappato è: un nome collezione è OrderItems e un altro è DTOOrderItems. Automapper mappa le proprietà per nome (Case sensitive) e non può risolvere questo.
per risolvere questo:
1) Rinominare DTOOrderItems (nella classe DTO) per OrderItems
o
2) mappatura Override per questa proprietà utilizzando il metodo ForMember da Automapper API. Qualcosa di simile a questo:

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

Lo stesso problema si avrà con le proprietà ORDERNUMBER Quantità e.

+4

Grazie. Ho dovuto eseguire il seguente AutoMapper.Mapper.CreateMap (). ForMember (dto => dto.DTOOrderItems, opt => opt.MapFrom (src => src.OrderItems)); – user1767363

0

È possibile scrivere questi nel metodo di estensione, invece di eseguire il ciclo in ogni pagina rimane in una singola pagina e sarà possibile riutilizzarlo senza codice duplicato.

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; 
     } 
Problemi correlati