2016-04-12 51 views
0

我想使用WebAPI OData服務公開一個簡單的數據模型。我的數據存儲在我使用EF訪問的數據庫中。因爲我的數據庫中的表使用不同的屬性名稱,並且在我的DTO中需要太多的字段,所以我使用AutoMapper將數據庫對象(或者說,ProjectTo)映射到DTO的。使用AutoMapper擴展到DTO的導航屬性(使用EF)

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; } 
} 

當我訪問一個特定的順序,我得到我的repsonse預期(即:所要求的順序排列):

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

當試圖擴大orderLines財產使用以下要求我得到以下回應:

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

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

我懷疑我的原因derLines對象爲空是因爲在從DB對象轉換爲DTO時,AutoMapper不考慮擴展。我的實體查詢看起來是這樣的:

_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但我不能得到這個工作。我在這裏錯過了什麼?

回答

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)); 
+0

而我是個白癡......我新的EF並沒有注意到相關的表被列入在可映射的屬性中。在我的辯護中,ORDERS表有120列,所以LINES「財產」很容易被忽略:) –