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

时间:2013-05-09 06:10:12

标签: wcf-data-services odata asp.net-web-api

如果您查看以下示例oData Feed,您会看到包含“子”项目的导航属性,以告诉您要关注的网址:

  

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,会自动推断继承   没有显式配置的层次结构。然后一次   推断层次结构,它还将推断属性和导航   属性也。这允许您编写更少的代码,专注于哪里   你偏离了我们的惯例。

1 个答案:

答案 0 :(得分:14)

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

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

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

请参阅此document以了解有关json light的更多信息。