向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的有效属性?

向OData Web API控制器添加自定义导航属性

可以尝试显式添加导航属性吗?

odataConventionModelBuilder().Entity<Coupon>().HasOptional(coupon => coupon.ItemRequirement)