为什么我的OData响应具有导航性能(Why doesn't my oData respon

2019-09-02 08:35发布

如果你看一下下面的示例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样本 )

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

当我真正调用网址为我的孩子财产它的工作原理,并给我的功能正确的列表:

 /oData/Products(18)/ProductFeatures

不过,我本来预计在导航属性/oData/Products(18)指向这一点。

什么我需要做的就是这样出现。 这篇文章说,这是自动的,但我没有看到他们:

的ODataConventionModelBuilder,通常建议在ODataModelBuilder,将自动推断继承层次结构中不存在明确的配置的。 然后,一旦该层次结构推断,它也将推断属性和导航属性了。 这允许你写更少的代码,专注于你来自哪里,我们的约定偏离。

Answer 1:

我认为问题是,你所要求的application/jsonapplication/json在网络API的OData指向JSON光这是最新的OData JSON表示旨在减少响应的有效负载大小和修整从响应未必要/冗余的元数据。 为了进行比较,尝试获得的URL ~/oData/Products(18)具有接受报头application/json;odata=verbose

现在,背后JSON光的想法是,如果一个链接可以计算出,因为链接如下约定,它不会被放在响应。 导航链路/oData/Products(18)/ProductFeatures就是一个很好的例子。 它遵循的OData URI约定。

的OData JSON光具有3种模式,minimalmetadata(缺省值),fullmetadata和nometadata。 名字本身说明。 如果你想链接到上线,发送与接收头请求application/json;odata=fullmetadata

请参阅本文件以了解更多有关JSON光。



文章来源: Why doesn't my oData response have navigation properties