【发布时间】:2021-09-09 16:57:31
【问题描述】:
如果您查看以下示例 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
我正在尝试对 ODataConventionModelBuilder 和 EntitySetController<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,将自动推断继承 没有显式配置的层次结构。然后一旦 层次结构被推断,它也会推断属性和导航 属性也。这使您可以编写更少的代码,专注于在哪里 你偏离了我们的约定。
【问题讨论】:
-
我找到了一个基本上可以完成我正在做的事情的示例 - 而且它也没有导航属性 - 我该如何启用它们 - 还是不支持? aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/…
-
我想我已经正式放弃了。 oData 太复杂了!
-
嗨@Simon_Weaver,我和你完全一样,但我得到的错误是:
Not implemented, This service doesn't support OData requests in the form '~/entityset/key/unresolved'.你能解决这个问题吗?
标签: wcf-data-services odata asp.net-web-api