2012-10-23 74 views
5

我写了一个简单的父子场景,并且无法使用Automapper将其映射。在以下情况下,我期待OrderItems的列表映射到dtoOrderItems列表,但不会自动发生。 我是否需要使用for循环或其他方式手动编写它?如何使用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; 
} 

回答

4

你不要集合映射的原因是:一个集合名称为的OrderItems,另一个是DTOOrderItems。自动映射器按名称映射属性(Case sensitive),无法解决此问题。
为了解决这一:
1)重命名DTOOrderItems(在DTO类)的OrderItems

2),用于使用从Automapper API ForMember方法此属性覆盖映射。事情是这样的:

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

同样的问题,你将有数量和订单号码属性。

+4

感谢。我不得不做以下AutoMapper.Mapper.CreateMap <订单,DTOOrder>()ForMember(DTO => dto.DTOOrderItems,选择=> opt.MapFrom(SRC => src.OrderItems)); – user1767363

0

您可以在扩展方法写这些,而是​​在每一页的循环仍然在一个单一的页面,你将能够重复使用而无需重复的代码。

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