【问题标题】:Automapper IEnumerable<T> of class is not mapped类的 Automapper IEnumerable<T> 未映射
【发布时间】:2020-04-23 16:24:31
【问题描述】:

我使用 ASP.NET Core 2.2 和 Automapper 9.0.0。

我有以下Order 模型类:

public partial class Order
{
    public Order()
    {
        OrderItems = new HashSet<OrderItem>();
    }

    public int Id { get; set; }

    public DateTime DatePlaced { get; set; }

    public virtual ICollection<OrderItem> OrderItems { get; set; }
}

和OrderDto 类:

public class OrderDto
{
    public int Id { get; set; }

    public DateTime DatePlaced { get; set; }

    public IEnumerable<OrderItemsDto> Items { get; set; }

}

我编写了以下配置来从 dto 映射到 model 类:

CreateMap<OrderItemsDto, OrderItem>()                
    .ForPath(dest => dest.Quantity, opt => opt.MapFrom(src => src.Quantity))
    .ForPath(dest => dest.TotalPrice, opt => opt.MapFrom(src => src.TotalPrice));


CreateMap<OrderDto, Order>()        
    .ForPath(dest => dest.DatePlaced, opt => opt.MapFrom(src => src.DatePlaced))        
    .ForPath(dest => dest.OrderItems, opt => opt.MapFrom(src => src.Items));
    // .ForMember(dest => dest.OrderItems, opt => opt.MapFrom(src => src.Items));

这是从 model 到 dto 类的配置:

CreateMap<OrderItem, OrderItemsDto>()
    .ForPath(dest => dest.Product.Name, opt => opt.MapFrom(src => src.Product.Name))
    .ForPath(dest => dest.Product.Price, opt => opt.MapFrom(src => src.Product.Price))
    .ForPath(dest => dest.Product.Category.Name, opt => 
        opt.MapFrom(src => src.Product.Category.Name))
    .ForPath(dest => dest.Quantity, opt => opt.MapFrom(src => src.Quantity))
    .ForPath(dest => dest.TotalPrice, opt => opt.MapFrom(src => src.TotalPrice));

CreateMap<Order, OrderDto>()
    .ForPath(dest => dest.DatePlaced, opt => opt.MapFrom(src => src.DatePlaced))
    .ForMember(dest => dest.Items, opt => opt.MapFrom(src => src.OrderItems));

但是,Items 始终为空,但 DatePlaced 已映射。

我得到了以下结果:

[
    {
        "id": 1,
        "datePlaced": "2020-02-09T21:48:13.347",      
        "items": []
    }
]

返回数据的方法:

return _mapper.Map<IEnumerable<OrderDto>>(await _orderRepository.GetAll());

Items如何才能正确映射?

【问题讨论】:

  • 您尚未为OrderItemsDto 创建映射 -> OrderItem(或者您尚未显示)。另外,应该是OrderItemDto(单)而不是OrderItemsDto(复数)?
  • @John 请看我更新的问题
  • 您是否有理由手动为所有这些同名字段设置映射? CreateMap&lt;Order, OrderDto&gt;(); CreateMap&lt;OrderItemsDto, OrderItem&gt;(); 本身还不够吗?
  • @John 不,没有理由。如果可以的话,我会尝试删除它们。

标签: c# automapper


【解决方案1】:

这是因为您缺少之间的映射 OrderItemsDto 和 OrderItem。 因此,Automapper 不知道如何映射集合中的项目。

添加映射 OrderItemsDto -&gt; OrderItem 和 OrderItem-&gt; OrderItemsDto

应该解决问题。

【讨论】:

  • 你能不能把return _mapper.Map&lt;IEnumerable&lt;OrderDto&gt;&gt;(await _orderRepository.GetAll());改成return _mapper.Map&lt;List&lt;OrderDto&gt;&gt;(await _orderRepository.GetAll());
  • 你可以试试(await _orderRepository.GetAll()).Select(_mapper.Map&lt;OrderDto&gt;)
  • 哎呀,这是我的错误。我只是应该看到其他Items 并且它们不是空的。感谢您的宝贵时间!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 2016-07-06
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
相关资源
最近更新 更多