ef4 导致 Web 服务中的循环引用

2024-03-27

我有一个 Reason 对象:

public class Reason
{
    public virtual long Id { get; set; }
    public virtual string Name { get; set; }
    public virtual Company Company {get;set;}
}

我正在使用实体框架 4,公司是公司的导航属性。
我还使用网络服务将数据返回给客户端。
我有返回原因的网络方法:

  [WebMethod]
    public Reason[] GetCallReasons()
    {
        IReasonRepository rep =
            ObjectFactory.GetInstance<IReasonRepository>();
        return rep.GetReasonsList().ToArray();
    }

由于 ef4,我在执行 Web 方法时遇到以下异常:

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

The problem accurs because ef4 adds property that can't be serialized: Image of the watch panel on rep.GetReasonsList().ToArray()

为了解决此问题并消除错误,我可以通过不将其设为虚拟或删除导航属性来禁用导航属性。但我需要它并想使用延迟加载功能。

我还可以为 Reason 编写特定的序列化器,但我在 Web 服务中使用了很多类,为所有这些类编写序列化器需要大量工作。

我该如何解决这个异常?...


您的问题有多种解决方案,它们实际上取决于您使用的服务类型和序列化类型:

  • 干净的方法是使用 DTO(数据传输对象),正如@Mikael 已经建议的那样。 DTO 是一种特殊的对象,它只传输您所需要的内容,仅此而已。您可以简单地创建不包含循环引用的 DTO 并使用自动映射器 http://automapper.codeplex.com/在实体和 DTO 之间进行映射,反之亦然。为@Mikael +1,因为他是第一个提到这一点的人。

所有其他方法都基于@Haz 建议的调整序列化:

  • WCF and DataContractSerializer:明确标记您的实体DataContract[IsReference=true]以及所有属性[DataMember]属性。这将允许您使用循环引用。如果您使用 T4 模板生成实体,则必须修改它以添加这些属性。
  • WCF and DataContractSerializer:隐式序列化。将相关导航属性之一标记为[IgnoreDataMember]属性,以便属性不被序列化。
  • XmlSerializer:标记相关导航属性之一[XmlIgnore]属性
  • 其他序列化:将相关导航属性之一标记为[NonSerialized](Haz +1,他是第一个提到这一点的人)用于常见的序列化或[ScriptIgnore]用于一些 JSON 相关的序列化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ef4 导致 Web 服务中的循环引用 的相关文章

随机推荐

  • 如何抑制由我​​无法更改的代码显示的对话框?

    我有一个来自第 3 方的 Inproc COM 服务器 我调用的函数之一如果捕获特定类型的错误 将显示错误消息对话框 问题是我正在尝试批量处理数据 而我正在使用的数据源导致错误对话框频繁弹出 如果它产生 1000 个对话框 这不会成为问题
  • javascript 内联有什么好的理由吗

    我一直在建立一个网站 在某个阶段 我注意到 IE 显示有点损坏 Chrome 几乎除了 body 标签 空 之外什么都没有渲染 而 FF 看起来都不错 在把键盘扔到房间里并用头撞鼠标后 我发现了问题 我在内联脚本块中留下了未关闭的 HTML
  • 运行 kubectl exec 时禁用 Kubernetes 上的网络日志

    跑步kubectl exec it
  • Oracle - 返回新插入的键值

    我们有一个带有主键的表 该表在插入时由表上的触发器填充 触发器从我们为表创建的序列中获取下一个序列号 并将其用作插入时键的值 现在我们希望能够在插入过程 PL SQL 中返回该值 类似于 SQL Server 中的 select scope
  • 为什么 .gitconfig [includeIf] 不起作用?

    系统设置 MacOS Catalina 10 15 6 gt git version git version 2 24 3 Apple Git 128 file gitconfig user name nickname email emai
  • 如何将大型对象/数组序列化为 JSON

    我的应用程序需要生成一个具有大对象的 jsondata数组类型的属性 数组在收集数据库输出时需要保留在内存中 并且某些属性只有在数组完成后才能确定 复杂性 数组是基于数字的 并且必须在 json 输出中出现 因此直接json encode
  • 使用内联“宽度”时省略像素

    这是一个有点愚蠢的问题 但对我来说理解很重要 据我所知 在 HTML 中使用内联 width 属性时 允许省略 px 除非使用百分比 20 否则将自动被理解为 20px 我的问题是 即使不需要 px 使用它是否错误 这段代码对我来说看起来非
  • 如何更改/usr/bin/env?

    我有使用的脚本 usr bin env ruby但我已经改用 Ruby Enterprise Edition 而不是 Ubuntu 服务器附带的默认 ruby 因此 当我尝试运行脚本时 它们会崩溃 如何添加 Ruby EE 路径 usr b
  • 如何使用 Apache POI 对 Excel 工作表中的行应用背景颜色?

    我正在使用 Apache POI 将数据导出到 Excel 工作表中 效果很好 问题是我需要在生成 Excel 工作表时为 Excel 工作表中的几行应用黄色背景颜色 请告诉我如何在生成时为 Excel 工作表的行应用背景颜色 谢谢 雷迪
  • 单父实体的核心数据性能

    我正在创建一个与核心数据一起使用的框架 在核心数据类上使用我的框架的要求之一是 您想要拥有框架功能的任何实体都需要是我提供给您的实体的子实体和子类 为此 我将该对象称为 Foo 今天我意识到 Core Data 将作为 Foo 子实体的所有
  • 在 Studio 中将大写字母转换为驼峰字母的简单方法?

    我有一堆 C 定义需要移植到 C C 定义是带下划线的大写字母 Net 枚举应该是驼峰式 有什么办法可以自动转换它们吗 一些我不知道的工具 或者也许是一个神奇的正则表达式 eg BOOTSTRAP NOT SUPPORTED gt Boot
  • 如何在进程的内存中搜索特定字符串?

    我对基础知识感兴趣 我不知道从哪里开始 我创建了这个测试程序 include
  • 如何在 LinqPad 中执行 ODATA 扩展

    我正在使用 LINQPad 连接到本地 CRM 组织上的 ODATA 服务 但我不知道如何使用 LINQPad 执行 联接 或遍历关系 这是我的网址 OrganizationData svc New locationSet select n
  • 如何在 Mac 上安装 NVM

    我尝试使用以下命令在 Mac 上安装 NVM curl o https raw githubusercontent com nvm sh nvm v0 39 1 install sh bash 但是 我收到一条错误消息 语法错误接近意外的
  • MPI+p 线程。程序卡在 MPI_Ssend 和 MPI_Recv 上

    我已经调试了这个程序2周了 它只有 93 行 但我仍然找不到错误 请帮我 这个程序在我的笔记本电脑上运行正常 但是当我在我的实验室 上海超算中心和济南超算中心的集群上运行时 就卡住了 这个程序的逻辑非常简单 有 2 个 MPI 进程 一个是
  • php.ini:哪一个?

    我从旧的 apache 迁移到 nginx 和 php 5 3 10 当我尝试修改 php ini 以满足我的需要时 我发现有 3 个 locate php ini etc php5 cgi php ini etc php5 cli php
  • 如何让 EF 将空字符串保留为 NULL?

    在我的域中 NULL 和空字符串之间没有重要区别 如何让 EF 忽略两者之间的差异并始终将空字符串保留为 NULL 空字符串不是字符串属性的默认值 因此这意味着您的代码正在某处设置空字符串 在这种情况下 您有责任处理 如果您在 POCO 中
  • Windows 安装程序中的主要与次要升级

    是否有任何理由不设置安装 以便始终完成主要升级并更改产品代码 我发现支持不同类型的安装需要更多代码 并且 修复 安装似乎通过重大升级更容易工作 而且需要安装的应用程序不是很大 因此不需要 服务包 或补丁安装程序 不会 如果您的应用程序很小并
  • 使用迭代器将数组划分为大小不等的部分

    我有一个数组 需要将其分为 3 元素子数组 我想用迭代器来做到这一点 但最终我迭代到了数组的末尾并出现段错误即使我没有取消引用迭代器 给定 auto foo 1 2 3 4 5 6 7 8 9 10 我正在做 auto bar cbegin
  • ef4 导致 Web 服务中的循环引用

    我有一个 Reason 对象 public class Reason public virtual long Id get set public virtual string Name get set public virtual Comp