我有一个 OData v3 Web API 项目。它使用 Entity Framework 代码优先模型。
主要类是优惠券。它有一个列表。这实际上是一个包含 ItemRequirement 和 BasketRequirement 子类型的 2 元素集合。我希望能够说:
../odata/Coupons(5)/ItemRequirement
我无法让它工作。
首先,在 EF 类中,我将 ItemRequirement 添加为 [NotMapped] 属性(因为该类已经将基类的集合作为导航属性,添加另外两个作为属性只会生成无关的表键并不必要地弄乱数据库。Code First 中的 Table-Per-Hierarchy 按原样工作得很好)。
ODataConventionModelBuilder() 没有选择 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 设置为导航/键/未解析。
我查看了这个解决方案,它也没有帮助我:
Adding a custom query backed Navigation Property to ODataConventionModelBuilder
我不知道问题是否出在继承、属性未映射到 EF 中,还是什么。
我还发现这会失败并返回 404:
oData/PurchaseRequirementsBases(5)/myNamespace.ItemRequirement
究竟需要什么巫术来抽象集合,以便 OData 消费者可以将 ItemRequirement 视为 Coupon 的有效属性?
最佳答案
您可以尝试显式添加导航属性吗?
odataConventionModelBuilder().Entity<Coupon>().HasOptional(coupon => coupon.ItemRequirement)
关于c# - 向 OData Web API Controller 添加自定义导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25004570/