首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >OData异常:不允许复杂类型的递归循环

OData异常:不允许复杂类型的递归循环
EN

Stack Overflow用户
提问于 2014-02-04 02:41:37
回答 4查看 4.4K关注 0票数 5

我通过OData公开了一个复杂类型。这个类是这样的:

代码语言:javascript
复制
public class RemoteFile 
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string Resource { get; set; }

    public virtual ICollection<RemoteFile> RelatedFiles { get; set; }
}

我通过OData公开它:

代码语言:javascript
复制
    var modelBuilder = new ODataConventionModelBuilder();
    modelBuilder.ComplexType<RemoteFile>();

这是我开始这个项目时得到的:

System.Web.Http.OData.dll中出现'System.ArgumentException‘类型的异常,但未在用户代码中处理

附加信息:复杂类型“RemoteFile”通过属性“RelatedFiles”对自身进行了引用。不允许复杂类型的递归循环。

如果存在针对此异常的处理程序,则程序可以安全地继续运行。

欢迎任何建议。

EN

回答 4

Stack Overflow用户

发布于 2014-02-04 05:30:34

听起来让RemoteFile成为实体类型比复杂类型更有意义。实体类型可以具有指向原始类型的属性,这是您设置RemoteFile的方式。您的类型定义还有一个key属性,该属性用于实体类型,而不是复杂类型。(可以将复杂类型看作是对一组标量属性进行分组的一种便捷方法。实体类型是系统的第一类类型,其中每个实例都可以唯一标识。)

因此,不是这样:

代码语言:javascript
复制
modelBuilder.ComplexType<RemoteFile>();

试试这个:

代码语言:javascript
复制
modelBuilder.EntitySet<RemoteFile>(“RemoteFiles”);

该行将创建实体类型RemoteFile和实体集RemoteFiles。实体集是一个实体类型的所有实例的容器。

那么为什么实体类型允许递归,而复杂类型不允许呢?当你请求一个实体时,默认情况下,服务器不会获取被引用实体的数据。您可以在查询中使用$expand显式请求被引用实体的数据,但不能无限扩展。另一方面,当您请求它们的父级时,复杂的值总是会被包括在内。因此,如果你有一个循环的复杂值,当你试图序列化它的时候,你会创建一个堆栈溢出。

票数 3
EN

Stack Overflow用户

发布于 2015-01-30 21:34:42

我也有同样的问题。我有一个有100多个实体的模型,我试图只添加两个,以便进行测试。

解决方案:将所有实体添加到ODataConventionModelBuilder,如下所示:

代码语言:javascript
复制
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Entity1>("Entity1");
builder.EntitySet<Entity2>("Entity2");
builder.EntitySet<Entity3>("Entity3"); 

//... and thus for ALL YOUR ENTITIES.

// If you don't want to expose any entity like EntitySet, simply add to builder like EntityType:
builder.EntityType<Entity4>("Entity4");

即使您不添加实体,构建器也会像扫描复杂类型一样扫描所有类型,并且关系也会失败。因此,有必要指定所有扫描的类型都是实体。

如果你不想公开像EntitySet这样的东西,你可以添加到像EntityType这样的构建器中,你的客户端引用将使用这个类,但不会给你提供对EntitySet (CRUD操作)的访问。此实体只能通过公开实体的关系间接使用。

票数 2
EN

Stack Overflow用户

发布于 2015-05-21 23:14:39

您是否需要显式地忽略导航属性?

代码语言:javascript
复制
modelBuilder.ComplexType<RemoteFile>().Ignore(x => x.RemoteFile);

希望这能有所帮助:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21535114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档