gpt4 book ai didi

.net - 如何序列化 EF POCO 自动生成的对象以避免循环引用?

转载 作者:行者123 更新时间:2023-12-05 01:34:32 26 4
gpt4 key购买 nike

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

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

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

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

我得到的错误

A circular reference was detected while serializing an object of type 'System.Data.Entity.DynamicProxies.Employee_34048F4F6A98297F826C798A27640C7383E95E8EA8282EC8A5F738FA0C77CBC3'."



异常(exception),这是对的,因为父级引用了它的子级,而子级引用了它的父级。

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

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

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

    非常感谢你

    最佳答案

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

  • 使用 RegisterConverters 并编写一个自定义转换器,指定除父属性之外的所有属性(这也可能是自动化的,可能使用定制的类级属性,如 [SkipSerialize("Parent")] 添加到 partial class - 虽然这可能过于复杂了)。
  • 简单地说:不要序列化 ​​EF POCO,而是使用 DTO - 听起来这就是您在 ViewModel 中的意思。回答。就个人而言,我对拥有一个类的“实体”(EF/POCO)版本和一个非常相似但不同的 DTO 版本没有任何问题——它们的意图是不同的,在我看来它并不违反 DRY。
  • 关于.net - 如何序列化 EF POCO 自动生成的对象以避免循环引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8501172/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com