使用 AutoMapper(使用 EF)扩展到 DTO 的导航 属性

Expand into a DTO's navigation property using AutoMapper (using EF)

我正在尝试使用 WebAPI OData 服务公开一个简单的数据模型。我的数据存储在我使用 EF 访问的数据库中。因为我的数据库中的表使用不同的 属性 名称并且我的 DTO 中需要的字段太多,所以我使用 AutoMapper 将(或者更确切地说,ProjectTo)从数据库对象映射到 DTO。

DTO 如下:

public class OrderDTO
{
    [Key]
    public int SalesOrderNumber { get; set; }
    //Navigation
    public virtual IEnumerable<OrderLineDTO> OrderLines { get; set; }
}

public class OrderLineDTO
{
    [Key]
    [ForeignKey("Order")]
    public int SalesOrderNumber { get; set; }
    [Key]
    public int LineNumber { get; set; }
    //Navigation
    public virtual OrderDTO Order { get; set; }
}

当我访问特定订单时,我得到了预期的回复(即:请求的订单):

http://localhost/.../Orders(salesOrderNumber=1)

当尝试使用以下请求扩展 orderLines 属性 时,我得到以下响应:

http://localhost/.../Orders(salesOrderNumber=1)?$expand=orderLines

{
  "@odata.context": "http://localhost/.../$metadata#Orders/$entity",
  "division": "STAND",
  "salesOrderNumber": 1,
  "orderLines@odata.context": "http://localhost/.../$metadata#Orders(salesOrderNumber=1)/orderLines",
  "orderLines": []
}

我怀疑我的 orderLines 对象为空的原因是因为 AutoMapper 在从 DB 对象转换为 DTO 时没有考虑扩展。我的实体查询如下所示:

_dbContext.ORDERS
  .Include("LINES")
  .Where(o => (o.ORD_NUM == salesOrderNumber))
  .ProjectTo<OrderDTO>()
  .FirstOrDefault();

AutoMapper 具有 OrderDTO 和 OrderLineDTO 的映射。配置如下:

CreateMap<ORDERS, OrderDTO>()
  .ForMember(dest => dest.SalesOrderNumber, opt => opt.MapFrom(src => src.ORD_NUM));

CreateMap<LINES, OrderLineDTO>()
  .ForMember(dest => dest.SalesOrderNumber, opt => opt.MapFrom(src => src.ORD_NUM))
  .ForMember(dest => dest.LineNumber, opt => opt.MapFrom(src => src.LIJNNR));

在我看来,这应该足以 $expand 到我的 orderLines 中,但我无法让它工作。我在这里错过了什么?

在我看来你确实缺少映射的显式配置 ORDERS.LINES to OrderDto.OrderLines:

CreateMap<ORDERS, OrderDTO>()
  .ForMember(dest => dest.OrderLines, opt => opt.MapFrom(src => src.LINES))
  .ForMember(dest => dest.SalesOrderNumber, opt => opt.MapFrom(src => src.ORD_NUM));