我有一个OData v3 Web API项目。它使用实体框架代码优先模型。
主类是Coupon。它有一个列表。这实际上是一个由两个元素组成的子类型ItemRequirement和BasketRequirement的集合。我想说的是:
../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视为优惠券的有效属性?
发布于 2014-07-31 11:46:41
您可以尝试显式添加导航属性吗?
odataConventionModelBuilder().Entity<Coupon>().HasOptional(coupon => coupon.ItemRequirement)https://stackoverflow.com/questions/25004570
复制相似问题