mao*_*mao 5 c# recursion complextype odata
我通过OData公开了一个复杂的类型.这个班是这样的:
public class RemoteFile
{
[Key]
public int Id { get; set; }
[Required]
public string Resource { get; set; }
public virtual ICollection<RemoteFile> RelatedFiles { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我通过OData公开它:
var modelBuilder = new ODataConventionModelBuilder();
modelBuilder.ComplexType<RemoteFile>();
Run Code Online (Sandbox Code Playgroud)
这是我开始项目时得到的:
System.Web.Http.OData.dll中出现"System.ArgumentException"类型的异常,但未在用户代码中处理
附加信息:复杂类型"RemoteFile"通过属性"RelatedFiles"引用自身.不允许复杂类型的递归循环.
如果存在此异常的处理程序,则可以安全地继续该程序.
任何建议都受到欢迎.
听起来作为RemoteFile实体类型更有意义,而不是复杂类型。实体类型可以具有指向原始类型的属性,这就是您设置的方式RemoteFile。您对类型的定义还有一个关键属性,该属性用于实体类型,而不是复杂类型。(将复杂类型视为对一组标量属性进行分组的便捷方法。实体类型是系统的第一类类型,其中每个实例都可以唯一标识。)
所以代替这个:
\n\nmodelBuilder.ComplexType<RemoteFile>();\nRun Code Online (Sandbox Code Playgroud)\n\n尝试这个:
\n\nmodelBuilder.EntitySet<RemoteFile>(\xe2\x80\x9cRemoteFiles\xe2\x80\x9d);\nRun Code Online (Sandbox Code Playgroud)\n\n该行将创建实体类型RemoteFile和实体集RemoteFiles。实体集是实体类型的所有实例的容器。
那么为什么实体类型允许递归而复杂类型不允许呢?当您请求实体时,默认情况下服务器不会获取引用实体的数据。您可以通过在查询中使用来显式请求引用实体的数据$expand,但不能无限扩展。另一方面,当您询问其父级时,将始终包含复数值。因此,如果您有一个循环复数值,当您尝试序列化它时,就会产生堆栈溢出。