在与 Jerther 进行聊天后,我们将问题缩小到未将扩展属性标记为包含导航的问题。结果,OData 框架正在删除它们,因为它们没有定义相应的实体集。更新模型以明确声明包含似乎已经解决了问题。
可以通过多种方式指定遏制,具体取决于所使用的模型构建器。对于ODataConventionModelBuilder,您可以将System.Web.OData.Builder.ContainedAttribute 添加到相关属性中,而对于ODataModelBuilder,您可以在包含类的EntityTypeConfiguration 实例上使用ContainsMany<T> 方法。
此外,目前,级联扩展将在复杂类型包含实体类型时停止。
更新:
将链中的所有类型定义为 EntitySet 有效。
builder.EntitySet<Item>("Items");
builder.EntitySet<Product>("Products");
builder.EntitySet<Model>("Models");
builder.EntitySet<Type>("Types");
似乎将它们定义为EntityType 是不够的。
请看这里:https://github.com/OData/WebApi/issues/226
原答案
我尝试重现您的情况,但没有成功。是否有可能没有在您的操作中设置“类型”?这是我的小复制品
public class ItemsController : ODataController
{
[HttpGet]
[EnableQuery(MaxExpansionDepth = 10)]
[ODataRoute("/Items")]
public IHttpActionResult GetItems()
{
return this.Ok(CreateItem());
}
private Item CreateItem()
{
return new Item
{
Id = 1,
Products = new Product[]
{
new Product
{
Id = 2,
Models = new Model[]
{
new Model
{
Id = 3,
Types = new MyType[]
{
new MyType
{
Id = 4,
},
},
},
},
},
},
};
}
}
当使用 /Items?$expand=Products($expand=Models($expand=Types)) 调用时,结果如下:
{
"@odata.context": "http://localhost:9001/$metadata#Items/$entity",
"Id": 1,
"Products@odata.context": "http://localhost:9001/$metadata#Items(1)/Products",
"Products": [{
"Id": 2,
"Models@odata.context": "http://localhost:9001/$metadata#Items(1)/Products(2)/Models",
"Models": [{
"Id": 3,
"Types@odata.context": "http://localhost:9001/$metadata#Items(1)/Products(2)/Models(3)/Types",
"Types": [{
"Id": 4
}]
}]
}]
}