关于实体框架:json序列化器中的循环引用异常

Circular reference exception in json serializer

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

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

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

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

我没有其他映射。

我如何解决这个问题?


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

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

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

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

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


我采取了忽略相关对象的方法。要做到这一点,您只需添加输入文本模板(.tt)文件。

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

1
2
3
#>
<#=codeStringGenerator.NavigationProperty(navigationProperty)#>
<#

一旦我将代码插入到codeStringGenerator上方的行中,我的类就会自动生成,如下所示:

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

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