4

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

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

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

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


我正在尝试对 and 做同样的事情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;
    }
}

当我实际调用我的子属性的 URL 时,它会起作用并为我提供正确的功能列表:

 /oData/Products(18)/ProductFeatures

但是,我本来希望导航属性/oData/Products(18)指向这一点。

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

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

4

1 回答 1

14

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

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

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

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

于 2013-05-09T23:32:20.873 回答