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

时间:2015-12-18 15:00:13

标签: json entity-framework entity-relationship jsonserializer

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

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

这种关系的另一面看起来像这样

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

我没有其他映射。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

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

我建议创建一个只包含所需属性的viewmodel类。然后,将您的实体映射到viewmodel类。返回viewmodel类实例而不是原始实体。

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

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

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

答案 1 :(得分:0)

我采取了忽略相关对象的方法。要做到这一点,你只需要添加 [ScriptIgnore(ApplyToOverrides = true)]到您的文字模板(.tt)文件中。

这是

之前我文本模板的一部分
#>
<#=codeStringGenerator.NavigationProperty(navigationProperty)#>
<#

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

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

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

相关问题