如果你看一下下面的示例OData源你会看到附带的导航属性的“孩子”项目来告诉你要跟踪的网址:
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样本 )
// 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,将自动推断继承层次结构中不存在明确的配置的。 然后,一旦该层次结构推断,它也将推断属性和导航属性了。 这允许你写更少的代码,专注于你来自哪里,我们的约定偏离。