我正在使用MVC5和Visual Studio 2013与实体框架。基本问题是当我们有这样的多对多关系时:
public class Person
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public ICollection<Group> Groups { get; set; }
public Patient()
{
Groups = new HashSet<Group>();
}
}
public class Group
{
public Guid ID { get; set; }
public string Name { get; set; }
public ICollection<Person> People{ get; set; }
public Group()
{
People = new HashSet<Person>();
}
}
我们希望得到像这样的记录的JSON表示
Person person = db.People.Include(x => x.Groups).Where(i => i.ID == id).Single();
string json=JsonConvert.SerializeObject(person);
JsonConvert抛出循环引用异常。
通过将http://www.example.com/facebook-callback配置为忽略循环引用异常,这个http://example.com/facebook-callback有一个简单的解决方案:
var serializerSettings = new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects };
string json=JsonConvert.SerializeObject(person,serializerSettings);
我的问题是:这仍然是处理这种情况的最佳方法吗?那些答案现在非常陈旧,这似乎是一种非常普遍的情况。我在我的解决方案中更新了我能想到的更新内容,但除非我执行额外的配置步骤,否则我仍然会得到异常。
此外,设置PreserveReferencesHandling = PreserveReferencesHandling.Objects
是否有副作用?有没有理由不这样做?
答案 0 :(得分:0)
不向不需要的/循环引用添加属性解决了循环序列化的问题。
http://www.newtonsoft.com/json/help/html/DataContractAndDataMember.htm
答案 1 :(得分:0)
另一种方法是通过从语句中删除include扩展方法来避免急切加载。或者为依赖对象创建另一个自定义类,并使用select(x =&gt; new CustomClass {PropertyOne = p.PropertyOne})
进行投影答案 2 :(得分:0)
你只需要添加
[ScriptIgnore(ApplyToOverrides = true)]
到您的文本模板(.tt)文件(EF数据模型的一部分)。
这是
之前我文本模板的一部分#>
<#=codeStringGenerator.NavigationProperty(navigationProperty)#>
<#
一旦我将代码插入自动生成的codeStringGenerator
我的类之上的行,看起来像这样:
[ScriptIgnore(ApplyToOverrides = true)]
public virtual ICollection<Currency> Currencies { get; set; }
我还需要修改UsingDirectives
函数以插入"using System.Web.Script.Serialization;"