向OData Web API控制器添加自定义导航属性
本文关键字:自定义 导航 属性 添加 控制器 OData Web API | 更新日期: 2023-09-27 18:15:12
我有一个OData v3 Web API项目。它使用实体框架代码优先模型。
主类是Coupon。它有一个列表。这实际上是一个包含两个元素的子类型ItemRequirement和basketrequirequirement的集合。我希望我能说:
../odata/Coupons(5)/ItemRequirement
我不能让这个工作。
首先,在EF类中,我添加了ItemRequirement作为[NotMapped]属性(因为类已经有一个基类的集合作为导航属性,添加另外两个属性只会生成多余的表键并不必要地扰乱数据库)。Code First中的每层表(Table-Per-Hierarchy)工作得很好。
odatacontiononmodelbuilder()没有将ItemRequirement作为导航属性
我试图添加它:
// GET odata/Coupons(5)/ItemRequirement
public ItemRequirement GetItemRequirement( [FromODataUri] decimal key)
{
return db.Coupons.Where(m => m.CouponId == key).SelectMany(m => m.RedemptionPurchaseRequirements).OfType<ItemRequirement>().FirstOrDefault();
}
URI永远不会进入这段代码。我发现通过添加一个IODataRoutingConvention实现器,ODataPath被设置为navigation/key/unresolved。
我看了这个解决方案,它也没有帮助我:
为odatacontiononmodelbuilder添加自定义查询支持的Navigation属性
我不知道问题是继承,属性没有映射到EF,还是什么。
我还发现这在404:
中失败了。oData/PurchaseRequirementsBases(5)/myNamespace.ItemRequirement
只是需要什么巫术来抽象集合,以便OData消费者可以将ItemRequirement视为Coupon的有效属性?
可以尝试显式添加导航属性吗?
odataConventionModelBuilder().Entity<Coupon>().HasOptional(coupon => coupon.ItemRequirement)