WebApi OData v4 ComlexType cannot have an EntityType
本文关键字:have an EntityType cannot ComlexType OData v4 WebApi | 更新日期: 2023-09-27 18:32:32
我们使用WebApi OData v3,并在包含EntitySet
实体的实体数据模型中定义了几个实体ComplexType
实体。
当移动到 OData v4 并在执行modelBulder.GetEdmModel()
步骤时,我们得到一个 InvalidOperationException "复杂类型'Foo'通过属性'Bar'引用实体'Bar'。
我查看规范,看到一种称为"抽象实体类型"的东西,它是一种包含实体类型的类型。我在 WebApi OData 代码中没有看到这一点,所以我希望我所要做的就是声明一个没有密钥的EntityType
,然后我得到了一个。
没有骰子。让我的Foo
键入一个EntityType
(执行modelBuilder.AddEntityType(typeof(Foo))
而不是modelBuilder.AddComplexType(typeof(Foo))
(会给出一个无效操作异常"实体'Foo'没有定义键"。
是否有一种实体数据模型干净的方式来使用ComplexType
或EntityType
?
一个干净但痛苦的解决方案是使更多本质上是我的实体的类重命名并作为ComplexType
添加到模型中,以便我可以将数据作为复杂类型返回(我将包括从实体类型转换为匹配复杂类型的运算符,以便它们可以在客户端代码中互换使用(。显然,我不想在升级到OData v4之前为工作正常的东西经历这种痛苦。
一种更简单但不干净的方法(我已经这样做并且它有效(涉及将一个未使用的密钥插入每个现在的EntityType
中,这些密钥曾经是这样的ComplexType
:
/// <summary>
/// Gets or sets the not used "key" property
/// </summary>
/// <remarks>
/// OData v4 seems to have broken the ability of a complex type to hold
/// an entity type. In the spec, there is the notion of an abstract
/// entity type - an entity type that does not have a key. But, it
/// appears v4 doesn't support abstract entity types. Hence, this "key".
/// </remarks>
[Key]
public int NotUsed { get; set; }
这是 V4 协议的一部分,尚未由 ODataLib for OData V4 实现(因此 OData V4 的 Web API 不支持定义此类模型,因为它基于 ODataLib 和其他核心库(。请在 https://github.com/odata/odata.net/issues 上打开 Github 问题以请求它并帮助跟踪它。