我已经查看了此链接:
Adding a custom query backed Navigation Property to ODataConventionModelBuilder
以及此链接:
Adding a custom navigation property to OData Web API Controller
但是,这些都没有真正帮助回答我的问题。 我们正在使用带有实体框架核心的ASP.Net Core和AspNetCore.OData库来构建OData服务端点,它们是相当新的,与撰写本文时的较早框架相比可能有所不同或缺乏支持。
我将提供一个关于我们正在尝试做的一般示例,然后具体询问我的问题。
设置:
我们有一个设置有“所有者”和“汽车”对象的EF Core模型。模型中的所有者和他/她的Cars之间存在一对多关系(即,Owner对象具有ICollection Cars {get; set;}属性。)这些名称对于示例是任意的,但足够了。
我们有一个OwnersController:具有标准的ODataController
[EnableQuery] public SingleResult<Owner> Get(int key) {...}
返回特定所有者的方法。
[EnableQuery] public IQueryable<Car> GetCars([FromODataUri] int key) { return _context.Owner .Include(o => o.Cars) .Single(record => record.Id == key) .Cars .AsQueryable(); }
到OwnerController类,这样一个URL如 “ http://localhost:50548/odata/Owners(123)/Cars”将返回指定所有者的汽车收藏。
这很好用,并且从本质上给了我们想要的结果:
{
"@odata.context": "http://localhost:50548/odata/$metadata#Car",
"value": [
{ "OwnerId": 123, "CarId": 2346, ... },
{ "OwnerId": 123, "CarId": 3543, ... },
...etc...
]
}
问题: 由于其现有含义,我不喜欢使用术语“导航属性”,但是我们想要做的就是向该对象添加一个字符串属性,其中包含集合,该属性表示导航回父所有者数据的路径。集合的元素:
{
"@odata.context": "http://localhost:50548/odata/$metadata#Car",
"parent": "/odata/Owner(123)", <== ADD THIS ===
"value": [
...
]
}
是否可以在ODataConventionModelBuilder中指定某些内容来做到这一点?
我们曾考虑创建某种包装对象,但不想这样做,因为那样一来,我们就失去了IQueryable <>的好处以及OData可以做到这一点。