2011-01-21 53 views
12

有一个帖子here,询问在通过EF4 CTP5返回一个序列化对象时如何解决循环引用错误。我遇到了与WCF Web表单项目相同的问题。我是如何解决Json序列化循环引用错误的?

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

public class MyObjectContext : DbContext, IDbContext 
{ 
    public MyObjectContext(string connectionStringName) : base(connectionStringName) 
    { 
     ((IObjectContextAdapter)this).ObjectContext.ContextOptions.ProxyCreationEnabled = false; 
    } 
    public DbSet<Product> Products {get;set;} 
    //etc. 
} 

我的问题是::

我在我的ObjectContext构造禁用ProxyCreation这样解决了这个问题有人能解释为什么会看似解决问题呢?

我认为这个问题与我的POCO的导航属性有关,但之后我很难过。谢谢。

+3

+1只是因为你的标题让我微笑! :-) – 2011-01-21 01:00:42

+0

你不能假装你知道你在这个地方谈论什么。最好说实话。感谢+1。 – trevorc 2011-01-21 01:33:49

回答

9

如果您关闭代理创建,也关闭延迟加载。当实体发生序列化时,它会访问所有导航属性。如果启用延迟加载,则会加载所有相关对象并尝试序列化它们。它再次访问其所有属性,包括指向父对象的导航属性。在这一点上,你必须说序列化这个属性是循环引用,否则它会再次序列化对象并继续无限循环。

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

-1

快速注:如果你仍然面临着异常记得摆脱

.Include("NestedObject")

这样的亲子关系将会消失以及异常

1

循环引用是因为你在对象上使用急切加载。

你有几个方法:

  • 关闭预先加载,当你加载你的查询(LINQ或lambda) DbContext.Configuration.ProxyCreationEnabled = FALSE;
  • 从的DomainModel
  • 删除虚拟关键字包括它们在加载对象
  • 拆离的对象(=无急切装载的功能&无代理)
    • Repository.Detach(entityObject)
    • 的DbContext。条目(entityObject).EntityState = EntityState.Detached
  • 克隆属性
    • 你可以使用像AutoMapper这样的东西来克隆对象,不要使用ICloneable接口,因为它也克隆了对象中的ProxyProperties,所以这是行不通的。
  • 如果你正在建立一个API,请尝试使用separte项目有不同的配置(即不返回代理)

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