我是如何解决Json序列化循环引用错误的?

我是如何解决Json序列化循环引用错误的?,json,entity-framework,serialization,Json,Entity Framework,Serialization,有一篇文章询问如何解决通过EF4 CTP5返回序列化对象时的循环引用错误。不久前,我在一个WCFWebForms项目中遇到了同样的问题 我能够在我的WCF/web表单项目和MVC3项目中“解决”这个问题。我认为什么类型的项目并不重要,因为这似乎是一件“事情” 我通过在ObjectContext构造函数中禁用ProxyCreation解决了此问题,如下所示: public class MyObjectContext : DbContext, IDbContext { public MyO

有一篇文章询问如何解决通过EF4 CTP5返回序列化对象时的循环引用错误。不久前,我在一个WCFWebForms项目中遇到了同样的问题

我能够在我的WCF/web表单项目和MVC3项目中“解决”这个问题。我认为什么类型的项目并不重要,因为这似乎是一件“事情”

我通过在ObjectContext构造函数中禁用ProxyCreation解决了此问题,如下所示:

public class MyObjectContext : DbContext, IDbContext
{
     public MyObjectContext(string connectionStringName) : base(connectionStringName)
     {
        ((IObjectContextAdapter)this).ObjectContext.ContextOptions.ProxyCreationEnabled = false;
     }
     public DbSet<Product> Products {get;set;}
     //etc.
} 
公共类MyObjectContext:DbContext,IDbContext { 公共MyObjectContext(字符串connectionStringName):基(connectionStringName) { ((IObjectContextAdapter)this).ObjectContext.ContextOptions.ProxyCreationEnabled=false; } 公共数据库集产品{get;set;} //等等。 } 我的问题是:有人能解释一下为什么这似乎能解决问题吗


我认为这个问题与我的POCO中的导航属性有关,但在那之后我就被难住了。谢谢。

如果您关闭代理创建,也会关闭延迟加载。实体序列化时,它将访问所有导航属性。如果启用了延迟加载,它将加载所有相关对象并尝试序列化它们。它再次访问它们的所有属性,包括指向父对象的导航属性。此时,您必须说明序列化该属性是循环引用,否则它将再次序列化对象并在无限循环中继续


这里的技巧可能是使用
ScriptIgnore
属性在子实体中注释您的循环导航属性。

快速注意:如果您仍然面临异常,请记住摆脱

。包括(“嵌套对象”)


这样,父子关系将消失,循环引用也会发生异常,因为您在对象上使用了急切加载

您有两种方法:

  • 加载查询(linq或lambda)时关闭即时加载 DbContext.Configuration.ProxyCreationEnabled=false
  • 从Domainmodel中删除虚拟关键字
  • 在加载对象时包含它们
  • 分离对象(=没有即时加载功能&没有代理)
    • Repository.Detach(entityObject)
    • 条目(entityObject).EntityState=EntityState.Distached
  • 克隆属性
    • 您可以使用AutoMapper之类的工具来克隆对象,但不要使用iClonable接口,因为它也会克隆对象中的ProxyProperties,所以这不起作用
  • 如果您正在构建API,请尝试使用具有不同配置(不返回代理)的separte项目

代理是EF从实体框架加载时创建的对象。简而言之:这意味着它保存原始值和更新的值,以便以后可以更新它们。它处理其他事情;-)

+1就因为你的头衔让我笑了!:-)你不能假装知道你在这里说什么。最好老实说。谢谢你的+1。这很有道理。我认为这必须涉及延迟加载,但我没有意识到代理创建关闭了延迟加载。回答得好!谢谢。ScriptIgnore不起作用,如果禁用代理创建,它可能会起作用。