发生异常的代码如下:

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

运行后错误信息如下:

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

问题分析:

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

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

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

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

解决方案:

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

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

    /** * 获取android当前可用内存大小 */ private String getAvailMemory() {// 获取android当前可用内存大小 ActivityManager am  ...

  2. 【ASP.NET】Layout使用详解

    1.母板页_Layout.cshtml 类似于传统WebForm中的.master文件,起到页面整体框架重用的目地 1.母板页代码预览 1 <!DOCTYPE html> 2 <ht ...

  3. linux文件系统 - 初始化(一)

    术语表: struct task:进程 struct mnt_namespace:命名空间 struct mount:挂载点 struct vfsmount:挂载项 struct file:文件 st ...

  4. 基于axis1.4的webservice实例

    1.准备工作: 概念:SOAP(简单对象访问协议).WSDL(web服务描述语言).XML(可扩展标记语言).axis(阿帕奇可扩展交互系统) (1)     下载axis1.4,将axis1.4中的 ...

  5. Socket编程知识必学

    端口号常识:    端口号被从1 开始分配.    通常端口号超出255 的部分被本地主机保留为私有用途.    1到255 之间的号码被用于远程应用程序所请求的进程和网络服务.    每个网络通信循 ...

  6. 转 HystrixDashboard服务监控、Turbine聚合监控

    SpringCloud系列七:Hystrix 熔断机制(Hystrix基本配置.服务降级.HystrixDashboard服务监控.Turbine聚合监控) 1.概念:Hystrix 熔断机制 2.具 ...

  7. Vue(五):Vue模板语法

    1.{{...}}(双大括号) 文本插值 <div id="app"> <p>{{ message }}</p> </div> 2. ...

  8. 如何运行你的Android程序?

    原文链接:http://android.eoe.cn/topic/android_sdk 本文中你将了解到: 1. 在真机上运行App 2. 在模拟器上运行App 你还应该阅读: 1. Using H ...

  9. mysql获得60天前unix时间示例

    在mysql中获取多少天前的unix时间的方法.首先根据now()获得当前时间,使用adddate()方法获得60天前时间,使用unix_timestamp()方法转换时间类型 select UNIX ...

  10. apicloud开发笔记

    第一次用apicloud做正式项目 ,下面把做的过程中用到的代码段列出来....都是从文档里复制的代码,只是感觉官网那个文档好难找哦... 注:api.????的方法都是在APP中调用才行的,$api ...