当前位置:  开发笔记 > 前端 > 正文

为什么我的oData响应没有导航属性

如何解决《为什么我的oData响应没有导航属性》经验,为你挑选了1个好方法。

如果您查看以下示例oData Feed,您将看到包含"子"项的导航属性,以告诉您要遵循的URL:

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

例如,供应商0具有产品的导航属性.这链接到该供应商的产品列表.

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


我正在努力做同样的事情ODataConventionModelBuilder,EntitySetController所以当我要求oData/Product(0)它时会告诉我产品的'功能':

我像这样创建我的模型(基于GetImplicitEdmModel示例)

     // odata
     ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
     modelBuilder.EntitySet("Product");
     modelBuilder.EntitySet("ProductFeature");

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

我为WebAPI创建了一个控制器:

public class  ProductController : EntitySetController
{
    RRStoreDBContext _db = new RRStoreDBContext();


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

    public ICollection 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)指向这个.

我需要做些什么才能让它出现.这篇文章说它是自动的,但我没有看到它们:

通常建议通过ODataModelBuilder的ODataConventionModelBuilder将在没有显式配置的情况下自动推断继承层次结构.然后,一旦推断出层次结构,它也将推断属性和导航属性.这使您可以编写更少的代码,专注于您偏离我们的约定的地方.

RaghuRam Nad.. 14

我认为问题是你要求的application/json.application/json在web API中,OData指向json light,这是最新的OData json表示,旨在减少响应有效负载大小并从响应中修剪不必要/冗余元数据.为了比较,尝试~/oData/Products(18)使用accept标头获取url application/json;odata=verbose.

现在,json light背后的想法是,如果链接可以计算,因为链接遵循约定,它将不会被放入响应中.导航链接/oData/Products(18)/ProductFeatures就是一个很好的例子.它遵循OData uri惯例.

OData json light有3种模式,minimalmetadata(默认),fullmetadata和nometadata.名称本身就是解释性的.如果您希望链接在线路上,请使用accept标头发送请求application/json;odata=fullmetadata.

请参阅此文档以了解有关json light的更多信息.



1> RaghuRam Nad..:

我认为问题是你要求的application/json.application/json在web API中,OData指向json light,这是最新的OData json表示,旨在减少响应有效负载大小并从响应中修剪不必要/冗余元数据.为了比较,尝试~/oData/Products(18)使用accept标头获取url application/json;odata=verbose.

现在,json light背后的想法是,如果链接可以计算,因为链接遵循约定,它将不会被放入响应中.导航链接/oData/Products(18)/ProductFeatures就是一个很好的例子.它遵循OData uri惯例.

OData json light有3种模式,minimalmetadata(默认),fullmetadata和nometadata.名称本身就是解释性的.如果您希望链接在线路上,请使用accept标头发送请求application/json;odata=fullmetadata.

请参阅此文档以了解有关json light的更多信息.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有