我们使用的是WebApi OData v 3 ,并且在实体数据模型中定义了几个ComplexType
个实体,其中包含EntitySet
个实体。
当转移到OData v 4 时,在执行modelBulder.GetEdmModel()
步骤后,我们得到一个InvalidOperationException"复杂类型' Foo'是指实体' Bar'通过物业' Bar'。"
我查看规范并看到一个名为"抽象实体类型"这是一种包含实体类型的类型。我没有在WebApi OData代码中看到这一点,所以我希望我所要做的就是声明一个没有密钥的EntityType
而我得到一个。
没有骰子。将Foo
类型设为EntityType
(执行modelBuilder.AddEntityType(typeof(Foo))
而不是modelBuilder.AddComplexType(typeof(Foo))
)会产生InvalidOperationException"实体' Foo'没有定义键#34;。
是否有实体数据模型干净的方式来使用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; }
答案 0 :(得分:1)
这是V4协议的一部分,ODataLib还没有为OData V4实现(因此OData V4的Web API不支持定义这样的模型,因为它基于它ODataLib和其他核心库)。请在https://github.com/odata/odata.net/issues上打开一个Github问题,要求它并帮助跟踪它。