4

我正在为 ASP.NET MVC 3 使用库(Telerik)。

我对需要通过 AJAX 返回一些数据的所有功能都有疑问:

我正在使用 EF4 连接我的数据库,并且我已经(并且需要)两种方式的导航属性(想象一下,一个用户有一些帖子,一个帖子有一个用户)。

问题是该库正在使用 JavaScriptSerializer,它使用 JSON 对数据进行编码。

我得到的错误

序列化“System.Data.Entity.DynamicProxies.Employee_34048F4F6A98297F826C798A27640C7383E95E8EA8282EC8A5F738FA0C77CBC3”类型的对象时检测到循环引用。”

例外,这是对的,因为父级引用了它的子级,而子级引用了它的父级。

我已经找到了一些解决方法,但没有什么能让我完全满意:

  • 使用数据服务器绑定:不能,该功能必须在 ajax 中工作(它是网格的分页器,当页面滚动到最后时加载下一个元素)
  • 使用匿名对象:不灵活,因为如果我在数据库中添加了一个字段,我必须将它添加到我所有的匿名对象中,另外,如果我需要有一个我想要的子集合,那很无聊还为此子列表的所有元素创建对象。
  • 使用 ViewModel:几乎同样的问题,如果我还有一个字段,我必须在所有 viewModel 上添加这个字段,并且我必须为我的所有 60 个视图创建一个视图模型,其字段与我的模型完全相同,...
  • 使用 NonSerializedAttribute :我不知道如何放入生成 POCO 对象的 T4 模板,我不确定它是否会起作用:有时主要对象是子对象,有时是父对象,空关系必须成为另一个。

我在使用 WCF 时遇到了几乎相同的问题,并且我创建了一个知道处理循环引用的序列化,我们可以在这里做同样的事情吗?或者有没有办法管理这个?

如果没有,我想最好的方法是使用“ViewModel”,但是有没有办法加速这些创建?像一个通用对象,它在构造函数中接受 EF 对象并删除循环引用?还要别的吗?

非常感谢你

4

1 回答 1

5

实际上,不是[NonSerialized],而是[ScriptIgnore]您需要的。不过,我会从两个角度之一来解决这个问题:

  1. 使用RegisterConverters并编写一个自定义转换器,该转换器指定父级之外的所有属性(这也可能[SkipSerialize("Parent")]是自动化的,也许使用像添加在 a 中的定制类级属性partial class- 不过这可能会使事情过于复杂)。

  2. 简单地说:不要序列化 ​​EF POCO,而是使用 DTO -听起来这就是您在ViewModel回答中的意思。就个人而言,我对拥有一个类的“实体”(EF/POCO)版本和一个非常相似但不同的 DTO 版本没有任何问题——它们的意图是不同的,在我看来它并不违反 DRY。

于 2011-12-14T09:15:20.600 回答