我有一个循环对象引用,它阻止一个对象被序列化为json。我试图在导致问题的属性上使用ScriptIgnoreAttribute,但它似乎不起作用。我相信这是因为我正在使用带有虚拟关键字的EF约定:
[ScriptIgnore]
public virtual SomeObject SomeObject { get; set; }
这种关系的另一面看起来像这样
public virtual ICollection<OtherObject> OtherObjects { get; set; }
我没有其他映射。
我该如何解决这个问题?
答案 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;"