Разверните в свойство навигации DTO, используя AutoMapper (используя EF)

Я пытаюсь раскрыть простую модель данных, используя службу ODAP WebAPI. Мои данные хранятся в базе данных, к которой я обращаюсь с помощью 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 не учитывает расширение при преобразовании из объектов БД в 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 в мои строки заказа, но я не могу заставить это работать. Что мне здесь не хватает?

1 ответ

Решение

Мне действительно кажется, что вам не хватает явной конфигурации для отображения 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));
Другие вопросы по тегам