无法将poco对象从EF 4转换为JSON

时间:2010-08-20 21:47:48

标签: json model-view-controller frameworks entity poco

我正在使用实体框架处理mvc 2.0应用程序。使用entityframework,我使用带有poco对象的存储库模式。要从问题开始,当我将实体对象转换为json时,我得到一个循环引用错误。

经过一些搜索,我发现生成了代理以支持延迟加载。如果两个类(A和B)之间存在导航属性,则会导致循环引用错误。很容易理解。所以我试着解决它。

我禁用了代理和延迟加载。如果我只想加载A类,这是有效的。而不是代理现在有空值,所以可以解析它们。

但现在我想加载一个类,例如Orders,我想看看客户下了什么订单:

假设我的类Customer具有Order(1到更多)的导航属性,而Order具有Customer的反向导航属性。当我关闭代理时,我得到一个很好的json返回所有订单,但不是与客户。当我打开代理时,我得到一个循环错误。

但我怎么能收到订单,而购买它们的客户。是否有可能创建一个可以检索订单并加载客户的linq(我有一个客户和订单的存储库)?或者有没有办法剥离代理对象?

我希望我的帖子很清楚,有人可以帮助我。

1 个答案:

答案 0 :(得分:0)

<强>问题:
对。所以你有A - &gt;的关系B与B是多方。 在EF模型中,A获取导航属性B,B获取导航属性A. 循环参考......很棒......

<强>解决方案:
在您的模型中,右键单击B的导航属性A并选择属性。 Getter和setter应该最初都是公开的。将getter设置为Private。

现在这样的事情应该有效。

var results = from a in ctx.A.Include("B")
select a;

var list = results.ToList(); //This is important otherwise youll get a error that the context has been disposed on the next line.
return Json(list, JsonRequestBehavior.AllowGet);

希望这有帮助。

PS: 在发布之后阅读我的答案后,我不再确定我真的回答了你的问题,对不起。不过,我会把它留下来。