我编写了一个简单的父子方案,但无法使用Automapper对其进行映射。在下面的场景中,我希望OrderItems列表映射到dtoOrderItems列表,但它不会自动发生。 我是否需要使用for循环或其他手动编写它?
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;
}
答案 0 :(得分:6)
您没有映射集合的原因是:一个集合名称是OrderItems,另一个是DTOOrderItems。 Automapper按名称(Case sensitive)映射属性,但无法解决此问题。
解决这个问题:
1)将DTOOrderItems(在您的DTO类中)重命名为OrderItems
或
2)使用Automapper API中的ForMember方法覆盖此属性的映射。这样的事情:
AutoMapper.Mapper.CreateMap<Order, DTOOrder>()
.ForMember(o => o.OrderItems, dto => dto.DTOOrderItems)
与Quantity和OrderNumber属性相同的问题。
答案 1 :(得分: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;
}