【问题标题】:Circular reference exception in json serializerjson序列化程序中的循环引用异常
【发布时间】:2015-12-18 15:00:12
【问题描述】:

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

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

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

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

我没有其他映射。

我该如何解决这个问题?

【问题讨论】:

  • 尝试使用[JsonIgnore]属性。

标签: json entity-framework entity-relationship jsonserializer


【解决方案1】:

问题是每个OtherObject对象都有一个对SomeObject的反向引用,而SomeObject又是一个OtherObject等的集合。

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

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

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

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

【讨论】:

  • 这似乎是最简单的解决方案,但是有没有其他方法可以解决这个问题?
  • 尽管 OJ Raqueno 的回答绝对是正确的方法,特别是从代码架构的角度来看,我设法解决了这个与 [JsonIgnore] 交换的 [ScriptIgnore] 属性。对于遇到类似问题的人来说,重构可能是一个挑战。更多信息在这里forums.asp.net/t/…
  • @Bartosz 很高兴您找到了最适合您特定情况的解决方案。
【解决方案2】:

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

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

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

在我插入代码后,codeStringGenerator 上方的行会自动生成,如下所示:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-04
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多