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;"
我有一个循环对象引用,它阻止对象被序列化到 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;"