【发布时间】:2014-09-20 04:35:15
【问题描述】:
我有一个 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。
我查看了这个解决方案,但它也没有帮助我:
Adding a custom query backed Navigation Property to ODataConventionModelBuilder
我不知道问题是继承,属性没有映射到 EF 中的事实,还是什么。
我还发现这会失败并出现 404:
oData/PurchaseRequirementsBases(5)/myNamespace.ItemRequirement
究竟需要什么魔法才能将集合抽象出来,以便 OData 消费者可以将 ItemRequirement 视为 Coupon 的有效属性?
【问题讨论】:
标签: c# entity-framework odata