Разверните в свойство навигации 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));