json 序列化程序中的循环引用异常

Circular reference exception in json serializer

我有一个循环对象引用,它阻止对象被序列化到 json。我试图在导致问题的 属性 上使用 ScriptIgnoreAttribute,但它似乎没有用。我相信那是因为我正在使用带有虚拟关键字的 EF 约定:

[ScriptIgnore]
public virtual SomeObject SomeObject { get; set; }

这段关系的另一面是这样的

public virtual ICollection<OtherObject> OtherObjects { get; set; }

我没有额外的映射。

我该如何解决这个问题?

问题是每个 OtherObject 对象都有对 SomeObject 的反向引用,后者又包含 OtherObject 等的集合

我建议创建一个仅包含您需要的属性的视图模型 class。然后,将您的实体映射到视图模型 class。 Return 视图模型 class 实例而不是原始实体。

另一种选择是告诉 json 序列化程序停止序列化循环引用。不过我更喜欢第一种方法。

您还可以影响 EF 行为(例如,通过删除 virtual 关键字禁用延迟加载)或更改查询。

但实际上,我更喜欢视图模型方法。我发现使用视图模型不仅可以解决这个问题,还可以解决其他问题。

我采用了忽略关联对象的方法。为此,您只需添加 [ScriptIgnore(ApplyToOverrides = true)] 到您的文本模板 (.tt) 文件中。

这是我之前的部分文本模板

#>
<#=codeStringGenerator.NavigationProperty(navigationProperty)#>
<#

一旦我插入代码,我的 类 自动生成的 codeStringGenerator 上方的行看起来像这样:

[ScriptIgnore(ApplyToOverrides = true)]
public virtual ICollection<Currency> Currencies { get; set; }

我还需要修改 UsingDirectives 函数以插入 "using System.Web.Script.Serialization;"