gpt4 book ai didi

c# - OData 异常 : A recursive loop of complex types is not allowed

转载 作者:太空狗 更新时间:2023-10-29 22:59:22 25 4
gpt4 key购买 nike

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

public class RemoteFile 
{
[Key]
public int Id { get; set; }
[Required]
public string Resource { get; set; }

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

然后我通过 OData 公开它:

    var modelBuilder = new ODataConventionModelBuilder();
modelBuilder.ComplexType<RemoteFile>();

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

System.Web.Http.OData.dll 中发生“System.ArgumentException”类型的异常,但未在用户代码中处理

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

如果有这个异常的处理程序,程序可以安全地继续。

欢迎任何建议。

最佳答案

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

所以不是这个:

modelBuilder.ComplexType<RemoteFile>();

试试这个:

modelBuilder.EntitySet<RemoteFile>(“RemoteFiles”);

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

那么为什么实体类型允许递归而不是复杂类型呢?当您请求实体时,默认情况下服务器不会获取引用实体的数据。您可以在查询中使用 $expand 显式请求引用实体的数据,但您不能无限扩展。另一方面,当您请求其父项时,复杂值将始终包含在内。因此,如果您有一个循环复数值,那么当您尝试对其进行序列化时就会造成堆栈溢出。

关于c# - OData 异常 : A recursive loop of complex types is not allowed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21535114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com