2013-05-09 64 views
4

如果你看一下下面的示例OData源,你會看到一個「孩子」項目包括導航屬性來告訴你要跟蹤的網址:爲什麼沒有我的OData響應具有導航性能

http://services.odata.org/OData/OData.svc/Suppliers?$format=json

例如,供應商0對產品具有導航屬性。 這個鏈接到供應商的產品列表。

http://services.odata.org/OData/OData.svc/Suppliers(0)/Products?$format=json


我試圖做同樣的ODataConventionModelBuilderEntitySetController<Product>這樣,當我要求oData/Product(0)它會告訴我的 '功能' 的產品:

我這樣創建我的模型(基於GetImplicitEdmModel sample

 // odata 
    ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); 
    modelBuilder.EntitySet<RRStoreDB.Models.Product>("Product"); 
    modelBuilder.EntitySet<RRStoreDB.Models.ProductFeature>("ProductFeature"); 

    Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel(); 
    config.Routes.MapODataRoute("ODataRoute", "odata", model); 

我創建的WebAPI控制器:

public class ProductController : EntitySetController<Product, int> 
{ 
    RRStoreDBContext _db = new RRStoreDBContext(); 


    [Queryable] 
    public override IQueryable<DProduct> Get() 
    { 
     return _db.Products.AsQueryable(); 
    } 

    public ICollection<ProductFeature> GetProductFeatures(int key) 
    { 
     Product product = _db.Products.FirstOrDefault(p => p.ProductId == key); 
     if (product == null) 
     { 
      throw new HttpResponseException(HttpStatusCode.NotFound); 
     } 
     return product.ProductFeatures; 
    } 
} 

當我居然要求我的孩子財產的URL它的工作原理,並給我的功能正確的列表:

/oData/Products(18)/ProductFeatures 

不過,我本來期望在/oData/Products(18)指向這個導航屬性。

我需要怎麼做才能讓它出現。 This article說,這是自動的,但我沒有看到他們:

的ODataConventionModelBuilder,通常建議在 的ODataModelBuilder,會自動推斷繼承 層次在沒有明確的配置。然後一旦推斷出層次結構,它也將推斷屬性並導航 屬性。這使您可以編寫更少的代碼,重點關注您偏離我們的約定的地方。

+0

我發現了一個樣本,基本上做了我正在做的事 - 它也沒有導航屬性 - 我如何啓用它們 - 或者不支持? http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/ODataServiceSample/ODataService/Controllers/ProductsController.cs – 2013-05-09 06:24:27

+0

我想我已經正式放棄了。 oData太複雜了! – 2013-05-09 08:29:22

+0

嗨@Simon_Weaver,我做的和你一樣,但是我得到的錯誤是:'沒有實現,這個服務不支持'〜/ entityset/key/unresolved'形式的OData請求。「你可以解決這個問題嗎? – ridermansb 2013-07-06 22:00:30

回答

14

我認爲問題在於您要求application/json。 Web API中的application/json OData指向json light,這是最新的OData json表示,旨在減少響應有效負載大小並修改響應中不必要/冗餘的元數據。爲了進行比較,請嘗試獲取帶有接受標題application/json;odata=verbose的網址~/oData/Products(18)

現在,json light背後的想法是,如果可以計算鏈接,因爲鏈接遵循約定,則不會將其放入響應中。導航鏈接/oData/Products(18)/ProductFeatures就是一個很好的例子。它遵循OData uri慣例。

OData json light有3種模式,minimalmetadata(默認),fullmetadata和nometadata。名字本身就是解釋性的。如果您希望鏈接在網絡上,請發送請求,接受標頭application/json;odata=fullmetadata

請參閱此document以瞭解有關json光的更多信息。

+0

太棒了 - 做到了!有沒有什麼辦法強制從瀏覽器調用完全JSON時,它很難設置接受的報頭 – 2013-05-10 01:36:55

+0

而不是URL中的'$ format = json',嘗試'$ format = application/json; odata = fullmetadata'。如果你使用JavaScript的OData,你可能會對[datajs](http://datajs.codeplex.com/)庫感興趣。據我所知,datajs在底層請求fullmetadata,但它會爲你抽象出一些這些細節。 – 2013-05-10 18:08:51

+1

Web API OData不支持$格式的開箱即用。通過使用消息處理程序來添加對$ format的支持是很容易的。我有一個示例[這裏](https://gist.github.com/raghuramn/5556691) – 2013-05-10 19:14:08

相關問題