繁体   English   中英

WebApi OData v4 ComlexType不能具有EntityType

[英]WebApi OData v4 ComlexType cannot have an EntityType

我们使用的是WebApi OData v 3,并且在实体数据模型中定义了一些包含EntitySet实体的ComplexType实体。

当移动到OData v 4并且在执行modelBulder.GetEdmModel()步骤时,我们得到一个InvalidOperationException“复杂类型'Foo'通过属性'Bar'引用实体'Bar'。”

我查看规范,看到一个名为“抽象实体类型”的东西,它是一种包含实体类型的类型。 我没有在WebApi OData代码中看到这一点,所以我希望我所要做的就是声明一个没有密钥的EntityType ,我得到一个。

没有骰子。 使我的Foo类型为EntityType (执行modelBuilder.AddEntityType(typeof(Foo))而不是modelBuilder.AddComplexType(typeof(Foo)) )会产生InvalidOperationException“实体'Foo'没有定义键”。

是否有实体数据模型干净的方式来使用ComplexTypeEntityType

一个干净但痛苦的解决方案是使更多基本上我的实体的类重命名并作为ComplexType添加到模型中,以便我可以将数据作为复杂类型返回(我将包括从实体类型到匹配复合体的转换操作符)类型,因此它们可以在客户端代码中互换使用)。 显然,在升级到OData v4之前,我不想为这个问题做好准备。

一个更简单但非干净的方式(我已经完成了这个并且它可以工作)涉及将一个未使用的密钥插入到现在每个EntityType ,这些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协议的一部分,OData Vib还没有为OData V4实现(因此OData V4的Web API不支持定义这样的模型,因为它基于ODataLib和其他核心库)。 请在https://github.com/odata/odata.net/issues上打开一个Github问题来询问它并帮助跟踪它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM