发生异常的代码如下:

  1. 1: public JsonResult GetSaleByNo1(string id)
  1. 2: {
  1. 3: SaleMvcUI.Helper.saleDBEntities saleDB = new Helper.saleDBEntities();
  1. 4: 
  1. 5: var saleF = (from sf in saleDB.t_saleform
  1. 6: where sf.f_saleform_no == id
  1. 7: select sf).First();
  1. 8: 
  1. 9: return this.Json(saleF, JsonRequestBehavior.AllowGet);
  1. 10: }

运行后错误信息如下:

  1. 1: 序列化类型为“SaleMvcUI.Helper.t_saleform”的对象时检测到循环引用。
  1. 2: 说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
  1. 3: 
  1. 4: 异常详细信息: System.InvalidOperationException: 序列化类型为“SaleMvcUI.Helper.t_saleform”的对象时检测到循环引用。
  1. 5: 
  1. 6: 源错误:
  1. 7: 
  1. 8: 执行当前 Web 请求期间生成了未经处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。

问题分析:

这里在数据库中设计的表有两个,分别结构如下图所示:

这两个表有1对多的实体映射关系。在生成的实体模型中,他们是可以通过这个一对多的映射关系查找相互之间的数据的。

在上面的第5行代码里面,这只是定义了一个Linq查询语句并且找出第一条数据,这是没有什么问题。在这个过程中,会自动查找与之有映射关系的数据。

第9行代码是在MVC里面返回一个json对象的数据,在这个过程中将我们找到的这条数据进行序列化为json对象的一个过程。在这个过程的时候, 由于这个对象有映射关系,那么它在序列化t_saleform对象的时候会序列化该对象的属性t_saleform_detail对象,而这个属性 t_saleform_detail对象又有属性t_saleform对象对象,依次反复。就导致了这个问题的产生。

解决方案:

将该实体对象的访问导航属性时是否自动加载相关对象属性关闭即可解决该问题。相关信息参考(MSDN),代码如下:

  1. saleDB.ContextOptions.LazyLoadingEnabled = false;
  1. 或者规避json序列化的时候直接序列化该t_saleform对象,改为序列化其它没有这种映射关系的对象。代码如下:
  1. 1: public JsonResult GetSaleByNo(string id)
  1. 2: {
  1. 3: SaleMvcUI.Helper.saleDBEntities saleDB = new Helper.saleDBEntities();
  1. 4: 
  1. 5: var saleF = (from sf in saleDB.t_saleform
  1. 6: where sf.f_saleform_no == id
  1. 7: select new
  1. 8: {
  1. 9: f_saleform_no = sf.f_saleform_no,
  1. 10: f_saleform_date = sf.f_saleform_date,
  1. 11: f_customer = sf.f_customer,
  1. 12: f_sales = sf.f_sales,
  1. 13: f_remark = sf.f_remark
  1. 14: }).First();
  1. 15: //此处为了好转换日期格式,多定义了一个临时变量。
  1. 16: var tm = new{
  1. 17: f_saleform_no = saleF.f_saleform_no,
  1. 18: f_saleform_date = saleF.f_saleform_date.ToString("yyyy-MM-dd"),
  1. 19: f_customer = saleF.f_customer,
  1. 20: f_sales = saleF.f_sales,
  1. 21: f_remark = saleF.f_remark
  1. 22: };
  1. 23: return this.Json(tm, JsonRequestBehavior.AllowGet);
  1. 24: }
分类: ASP.NET MVC, Linq, SQL

ADO.NET 实体数据模型 异常-“序列化类型为 XX 的对象时检测到循环引用”的更多相关文章

  1. MVC EF异常-“序列化类型为 XX 的对象时检测到循环引用”

    原因:在EF实体中,两个互为主外键关系的实体类的导航属性相互引用. 解决方法一:删除一个不需要的类的导航属性 方法二:使用DTO模型 方法三:直接返回需要的属性(不能包括相互引用的属性)

  2. 序列化类型为XX的对象时检测到循环引用

    /// 产品列表展示 /// </summary> /// <returns></returns> ) { //获得所有组别 Galasys_IBLL.IT_BIZ ...

  3. mvc EF框架中,加载外键对象序列化对象时报错 序列化类型为XX的对象时检测到循环引用

    Newtonsoft.Json.dll 或者通过->工具->库程序包管理工具->NuGet管理包->联机 输入Newtonsoft或者json.net Newtonsoft.J ...

  4. 关于EF的 序列化类型为“XXX”的对象时检测到循环引用。

    在用Ef的时候,也许经常会遇到循环引用的错误. 下面提供解决办法.(不是Json.Net,如果是Json.Net可以给导航属性通过增加特性标签来解决该问题) ef大多数问题,可以通过ToList()来 ...

  5. EF提示“序列化类型为XXX的对象时检测到循环引用”

    能看到这个标题 ,我就用解释原因,网上很多,我只给大家一个解决方案会: public <#=code.Escape(entity)#> ToPOCO() { return new < ...

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

    学习 EF Code First+MVC 时遇到了在请求JsonResult时出现 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用 的异常,原因 ...

  7. 序列化类型为“System.Data.Entity.DynamicProxies..."对象时检测到循环引用

    这是因为EF外键引起的序列化问题. 解决方案: context.Configuration.ProxyCreationEnabled = false; 这里我用的是一个基类控制器用于被继承 返回EF实 ...

  8. 序列化类型为“System.Reflection.Module”的对象时检测到循环引用

    在使用ajax调用web services时,正好返回的类型为datatable,想用通过json方式直接解析,但调用后,得到如下错误: 序列化类型为“System.Reflection.Module ...

  9. 在mvc返回JSON时出错:序列化类型为“System.Data.Entity.DynamicProxies.Photos....这个会的对象时检测到循环引用 的解决办法

    在MVC中返回JSON时出错,序列化类型为“System.Data.Entity.DynamicProxies.Photos....这个会的对象时检测到循环引用. public ActionResul ...

随机推荐

  1. Java使用Itext5.5.10进行pdf签章

    说到PDF数字签名签章,这个其实也是数字证书信息安全的应用范畴,关于数字证书和数字签名,网上有很多解释说明,但讲解都多不够详细准确,这边推荐一篇大神的博文,讲解浅显易懂形象数字证书 数字签名 数据加密 ...

  2. IntelliJ IDEA 最新激活码(截止到2018年10月14日)

    IntelliJ IDEA 注册码: EB101IWSWD-eyJsaWNlbnNlSWQiOiJFQjEwMUlXU1dEIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYX ...

  3. 代码管理(三)sourcetree 的使用

    一.SourceTree简介   SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端,拥有可视化界面,容易上手操作.同时它也是Mercurial和Subv ...

  4. Runway for Mac(UML 流程图绘图工具)破解版安装

    1.软件简介    Runway 是 macOS 系统上一款强大实用的软件开发工具,Runway for Mac 是一个界面简单功能强大的UML设计师.此外,Runway for Mac 带给你所有你 ...

  5. C语言下的错误处理的问题

    下面是三种C语言的错误处理,你喜欢哪一种?还是都不喜欢? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 /* 问题: 不充分,而且很容易出错,前 ...

  6. C#数组之 []、List、Array、ArrayList应用

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  7. jQuery $.ajax 参数说明及调用注意事项

    $.ajax参数设置 备注:data.contentType.dataType属性值很重要!!! async 类型:Boolean 默认值: true.默认设置下,所有请求均为异步请求.如果需要发送同 ...

  8. STM32定时器T2纯软件仿真时间准确,JTAG在线调试查看时间不准的问题

    通过查看Sec的值和上次中断的差值计算的,虽然这个值是不准的 ,但实际上时间是准的, 原因如下:stm32在调试模式下虽然进断点之后程序停止了,但定时器的时钟还在走,计数器还在计数,若要在产生断点时计 ...

  9. 【转】WARNING! File system needs to be upgraded. You have version null and I want version 7. Run the '${HBASE_HOME}/bin/hbase migrate' script. 的解决办法

    前段时间集群出问题,hadoop和hbase启动不了了. 后来hadoop回复了,hbase死活master无法启动.打开日志发现报了以下错误: WARNING! File system needs ...

  10. Vue 动态组件、动画、插件

    1 动态组件 ①简单来说: 就是几个组件放在一个挂载点下,然后根据父组件的某个变量来决定显示哪个,或者都不显示. ②动态切换: 在挂载点使用component标签,然后使用v-bind:is=”组件名 ...