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但我不能得到這個工作。我在這裏錯過了什麼?
而我是個白癡......我新的EF並沒有注意到相關的表被列入在可映射的屬性中。在我的辯護中,ORDERS表有120列,所以LINES「財產」很容易被忽略:) –