【问题标题】:Adding a custom navigation property to OData Web API Controller向 OData Web API 控制器添加自定义导航属性
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 我会尝试并报告。很难弄清楚为什么有时 Annotations 起作用,有时约定起作用,而有时模型构建器起作用,无论以何种组合。
    猜你喜欢
    • 2021-06-27
    • 2013-04-15
    • 2015-01-03
    • 1970-01-01
    • 2013-02-22
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    相关资源
    最近更新 更多