C# 自动映射嵌套列表对象
我正在尝试用DTO对象映射嵌套列表,但它不起作用。这是我试过的。一切返回空值。我得到的错误是:AutoMapper.dll中发生了类型为“AutoMapper.automappingexception”的异常,但未在用户代码中处理该异常C# 自动映射嵌套列表对象,c#,automapper,C#,Automapper,我正在尝试用DTO对象映射嵌套列表,但它不起作用。这是我试过的。一切返回空值。我得到的错误是:AutoMapper.dll中发生了类型为“AutoMapper.automappingexception”的异常,但未在用户代码中处理该异常 public class ordersview_Dto { public int orderID { get; set; } public string orderNumber { get; set; } public float? or
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; }
}
public class ordersview\u Dto
{
公共int-orderID{get;set;}
公共字符串orderNumber{get;set;}
公共浮点?orderTotal{get;set;}
公共字符串lastName{get;set;}
公共字符串名{get;set;}
公共列表ProductsDTO{get;set;}
}
公共类产品
{
公共int id{get;set;}
公共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);
Mapper.CreateMap()
.ForMember(h=>h.productsdo,k=>k.MapFrom((m=>m.orderLines));
IEnumerable ordersList=new ordersepository().getOrders();
IEnumerable ordersFlow=Mapper.Map(ordersList);
我确信问题依赖于这一行:.ForMember(h=>h.productsdo,k=>k.MapFrom((m=>m.orderLines))ProductsDTO和订单行都是列表
以下是我的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;
}
公共类OrderHeader
{
public OrderHeader()
{
//在此处设置任何默认值;
orderLines=新列表();
}
公共浮点?小计{get;set;}
公共浮动?传送{get;set;}
公共字符串方法{get;set;}
公共浮动税{get;set;}
public int SalesID{get;set;}
公共字符串IpAddress{get;set;}
//映射
公众客户;
公共秩序;
公共广播;
公共列表命令行;
}
您的自动映射声明是正确的
在映射之前,能否验证ordersList.orderLines
是否为null
或空?
您的ordersepository
可能没有按照您认为的方式提供或填充ordersList
IEnumerable<OrderHeader> ordersList = new OrdersRepository().getOrders();
// Check value of ordersList.orderLines.Count here
// (assuming orderLines is an IEnumerable<T>
没有理由将其指定为列表
。您可能会遇到类型不匹配异常,因为您无法将任何订单行
强制转换到列表
更新2 您正在尝试将
IEnumerable
映射到IEnumerable
,这些类型不一致。你也有这张地图吗
你也需要这样的东西:
Mapper.CreateMap<OrderLine, ProductsDTO>().forMember(...
Mapper.CreateMap().FormMember(。。。
您还需要创建一个映射来处理您的orderLines
集合包含的任何类,到ProductDTO
。AutoMapper不知道如何处理这些类,所以忽略它们。什么类型的orderLines
(我们缺少OrderHeader类),并且您是否确保订单行不为null或空?我调试了ordersList,它返回正确的集合。当我映射列表时,AutoMapper会自动知道?我得到的错误是:AutoMapper.dll中发生了类型为“AutoMapper.AutoMappingException”的异常,但在用户代码中未处理。此异常是新的吗?它是在你的原始问题中没有提到。另外,orderLines
是否是一个IEnumerable
?是的,它是IEnumerable,我更新了我的问题,请查看orderHeader类。它是相同的例外。我上面发布的所有代码,我没有任何其他的订单行映射。我是AutoMapper的新手。太好了!如果属性名称和类型是相同的,您可以排除FormMember
子句,因为AutoMapper足够智能,可以为您映射这些子句。我在我的答案中对此进行了说明。@chadiusvt抱歉,我想我在您更新您的答案时键入了我的答案。我最初没有看到它。
Mapper.CreateMap<OrderLine, ProductsDTO>().forMember(...