我试图使用WebAPI OData服务公开一个简单的数据模型。我的数据存储在我使用EF访问的数据库中。因为我的数据库中的表使用不同的属性名称,并且我的DTO中需要太多的字段,所以我使用AutoMapper将数据库对象(或更确切地说,ProjectTo
)映射到DTO'第
DTO&#39>如下:
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
进入我的订单线,但我不能让它发挥作用。我在这里缺少什么?
答案 0 :(得分:0)
在我看来,您似乎缺少映射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));