使用AutoMapper(使用EF)

时间:2016-04-12 07:21:58

标签: c# entity-framework-6 automapper odata-v4

我试图使用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进入我的订单线,但我不能让它发挥作用。我在这里缺少什么?

1 个答案:

答案 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));