2011-11-03 20 views
0

Serializing Entity Framework problems拆离EF对象,以避免基于在此线程韦斯资助的答案循环引用

我尝试下面的代码:

string sid = HttpContext.Current.Request["Sid"]; 
SYSTEM system = context.SYSTEM.Where(s => s.SYSTEM_ID.Contains(sid)).First(); 

context.Detach(system); 

HttpContext.Current.Response.Write(serializer.Serialize(system)); 

但我仍然得到了循环引用除外。我在这里错过了明显的东西吗?谢谢

+0

使用视图模型。不要尝试JSON序列化一些EF自动生成的模型。 –

+0

@DarinDimitrov在Web窗体中查看模型? :)当然 – Johan

+0

。视图模型应该用在任何正确设计的面向GUI的应用程序中。例如,在你的案例中,视图模型将帮助你解决你的循环依赖问题。循环依赖的对象图不能被JSON序列化,因为JSON规范没有为它们提供任何东西。 –

回答

0

如果你使用的是EntityObjects而不是POCOs,你不能这样做。原因是如果你的SYSTEM类型来自EntityObject它继承了一些也将被序列化的属性。见herehere

解决方法是,

  • 切换到使用波苏斯,而不是EntityObjects
  • 编写自己的转换器,在解释了SO问你链接
  • 射出您查询到匿名类型和serialize those使用JavaScriptSerializer
  • 映射你的实体数据传输对象(DTO的;在主他们的数据合同),并将这些

编辑:

如果您已经使用POCO的原因可能是EF为了更改跟踪和懒加载工作在内部创建proxy classes您波苏斯。这些代理类是动态创建的,可能导致序列化失败。

+0

感谢您的回答。我有我系统的poco版本。当我创建一个新的SYSTEM实例时,它会不会被使用? – Johan

+0

@Johan好的,也许问题是EF在后台创建了一个代理对象。我更新了答案。 – Andreas