我正在使用ASP.NET MVC 3的库(Telerik)。
我的所有功能都存在问题,需要通过AJAX返回一些数据:
我正在使用EF4来连接我的数据库,而且我已经(并且需要)两种方式的导航属性(想象一下,有一些帖子和一个帖子的用户都有用户)。
问题是该库正在使用JavaScriptSerializer,它使用JSON对数据进行编码。
我得到的错误
序列化“System.Data.Entity.DynamicProxies.Employee_34048F4F6A98297F826C798A27640C7383E95E8EA8282EC8A5F738FA0C77CBC3”类型的对象时检测到循环引用。“
异常,这是正确的,因为父级引用了它的子级,并且子级引用了它的父级。
我已经找到了一些解决方法,但没有什么能完全满足我的要求:
我和WCF几乎有同样的问题,我创建了一个知道处理循环引用的序列化,我们可以在这里做同样的事情吗?或者有办法管理这个吗?
如果没有,我认为最好的方法是使用“ViewModel”,但有没有办法加速这些创作?像一个泛型对象,它接受构造函数EF对象并删除循环引用?其他什么?
非常感谢
答案 0 :(得分:5)
实际上,您需要的不是[NonSerialized]
,而是[ScriptIgnore]
。不过,我会从两个角度中的一个角度来看待这个:
使用RegisterConverters
并编写一个自定义转换器,指定除父项之外的所有属性(这可能可能也是自动化的,也许正在使用在[SkipSerialize("Parent")]
中添加了一个定制的类级别属性,如partial class
- 这可能使事情过于复杂。“
简单地说:不要序列化EF POCO,而是使用DTO - 它声音就像你在ViewModel
答案中所说的那样。就个人而言,我没有问题,有一个类的“实体”(EF / POCO)版本和一个非常相似但不同的DTO版本 - 他们的意图是不同的,在我看来它不会违反DRY。