AutoMapper映射嵌套的List对象

时间:2014-03-20 19:09:30

标签: c# automapper

我正在尝试使用我的DTO对象映射嵌套列表,但它不起作用。这是我试过的。一切都返回null。我得到的错误是: AutoMapper.dll中发生了'AutoMapper.AutoMapperMappingException'类型的异常,但未在用户代码中处理

public class ordersview_Dto
{
    public int orderID { get; set; }
    public string orderNumber { get; set; }
    public float? orderTotal { get; set; }
    public string lastName { get; set; }
    public string firstName { get; set; }
    public List<ProductsDTO> ProductsDTO { get; set; }

}

public class ProductsDTO
{


    public int id { get; set; }

    public int OrderID { get; set; }

 }

这就是我的映射方式:

        Mapper.CreateMap<OrderHeader, ordersview_Dto>()
        .ForMember(h => h.ProductsDTO, k => k.MapFrom((m => m.orderLines)));

        IEnumerable<OrderHeader> ordersList = new OrdersRepository().getOrders();

        IEnumerable<ordersview_Dto> ordersFlow = Mapper.Map<IEnumerable<OrderHeader>, IEnumerable<ordersview_Dto>>(ordersList);

我确信问题依赖于这一行: .ForMember(h =&gt; h.ProductsDTO,k =&gt; k.MapFrom((m =&gt; m.orderLines))); ProductsDTO和OrderLines都是列表。

这是我的OrderHeader类:

 public class OrderHeader
    {

        public OrderHeader()
        {
            // Set any defaults here;
            orderLines = new List<OrderLines>();
        }


        public float? SubTotal { get; set; }

        public float? Shipping { get; set; }

        public string ShipMethod { get; set; }

        public float? Tax { get; set; }



        public int SalesID { get; set; }

        public string IpAddress { get; set; }

        // Mapping

        public Customer customer;
        public OrderCC ordercc;
        public OrderAddress orderAddress;
        public List<OrderLines> orderLines;


    }

2 个答案:

答案 0 :(得分:1)

您的AutoMapper地图声明是正确的。

您可以在映射前验证ordersList.orderLines是否为null或为空吗? 您的OrdersRepository可能没有以您认为的方式提供或填充ordersList

IEnumerable<OrderHeader> ordersList = new OrdersRepository().getOrders();
// Check value of ordersList.orderLines.Count here
// (assuming orderLines is an IEnumerable<T>

<强>更新

在验证orderLines不为空后,可能会将ProductsDTO声明更改为:

public IEnumerable<ProductsDTO> ProductsDTO { get; set; }

没有理由将其指定为List<>。您可能会遇到类型不匹配异常,因为您无法将orderLines转换为List<>


更新2

您正尝试将IEnumerable<OrderLines>映射到IEnumerable<ProductsDTO>,这些不是一致类型。你有这张地图吗?

你也需要这样的东西:

Mapper.CreateMap<OrderLine, ProductsDTO>().forMember(...

答案 1 :(得分:1)

您还需要创建一个映射来处理orderLines集合包含的任何类,ProductDTO。 AutoMapper不知道如何处理这些,所以忽略它们。