2013-05-09 62 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

相关问题