c# - 向 OData Web API Controller 添加自定义导航属性

标签 c# entity-framework odata

我有一个 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/

相关文章:

c# - 我可以在不扩展表格的情况下扩展模型吗?

通过 OData : how to specify the authentication scheme via curl/RCurl? 读取数据

ember.js - Ember 数据和 Northwind OData

c# - 更新到VS 16.9.0 : Feature 'init-only setters' is not available in C# 7. 3之后。请使用语言版本9.0或更高版本

c# - 在 UI 中对行进行分组并在 C# 中插入两个表

c# - ItemsControl 上的设计时 ItemsSource

oracle - 无法使用 EFPowerTools Beta2 VS2012 对代码优先进行逆向工程

c# - 将磁贴固定到开始屏幕上的选定位置(以编程方式)Windows 8

.net - Entity Framework 批量显式加载

odata - SAPUI5 OData 模型中的应用程序数据如何写回后端系统