我有一个 OData v3 Web API 项目。它使用实体框架代码优先模型。
主要类别是Coupon。它有一个列表。这实际上是子类型 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 设置为 navigation/key/unresolved。
我查看了这个解决方案,它也没有帮助我:
将自定义查询支持的导航属性添加到 ODataConventionModelBuilder https://stackoverflow.com/questions/23082927/adding-a-custom-query-backed-navigation-property-to-odataconventionmodelbuilder
我不知道问题是否在于继承、属性未在 EF 中映射,或者什么。
我还发现此操作失败并出现 404:
oData/PurchaseRequirementsBases(5)/myNamespace.ItemRequirement
到底需要什么魔法才能将集合抽象出来,以便 OData 使用者可以将 ItemRequirement 视为 Coupon 的有效属性?