Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动映射嵌套列表对象_C#_Automapper - Fatal编程技术网

C# 自动映射嵌套列表对象

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

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

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(...