有岗位这里,询问如何通过返回EF4CTP5序列化对象时,解决循环引用错误。不久前,我在WCF Web表单项目中遇到了同样的问题。
我能够在WCF / Web窗体项目和MVC3项目中“解决”此问题。我认为什么类型的项目都不重要,因为这似乎是EF序列化的“事物”。
我通过在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. }
我的问题是:有人可以解释为什么这看起来可以解决问题吗?
我认为问题与POCO的导航属性有关,但此后我很困惑。谢谢。
如果您关闭代理创建,那么您还将关闭延迟加载。实体序列化发生时,它将访问所有导航属性。如果启用了延迟加载,它将加载所有相关对象,并尝试对其进行序列化。再次访问其所有属性,包括指向父对象的导航属性。在这一点上,您必须说序列化此属性是循环引用,否则它将再次序列化对象并继续无限循环。
这里的窍门可能是用属性在子实体中注释循环导航ScriptIgnore属性。
ScriptIgnore