发生异常的代码如下:

   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. jquery 父、子页面之间页面元素的获取,方法的调用

    一.jquery 父.子页面之间页面元素的获取,方法的调用: 1. 父页面获取子页面元素: 格式:$("#iframe的ID").contents().find("#if ...

  3. 黑客公布2012年最弱智密码Top25(转)

    尽管弱密码对安全性的危害大家都知道,但是仍然有很多网民使用超弱密码.日前,黑客公布了一份密码文档,列出了今年最弱智密码. 根据 SplashData 公布的“年度最弱智密码 Top25”,和去年一样, ...

  4. 什么是Web缓存控制(基于HTTP头域)

    这是一篇转载的知识性的文档,主要目的是为了让Web缓存相关概念更容易被开发者理解并应用于实际的应用环境中.为了简要起见,某些实现方面的细节被简化或省略了.如果你更关心细节实现则完全不必耐心看完本文,后 ...

  5. 实战Apache+Tomcat集群和负载均衡

    实战Apache+Tomcat集群和负载均衡 目录 1.    什么是J2EE集群... 3 1.1.     序言... 3 1.2.     基本术语... 3 伸缩性(Scalability): ...

  6. springboot 中使用Druid 数据源提供数据库监控

    一.springboot 中注册 Servlet/Filter/Listener 的方式有两种,1 通过代码注册 ServletRegistrationBean. FilterRegistration ...

  7. js关闭当前页面和给子页面的对象赋值

    代码如下: function saveData(){ //给父页面的对象赋值 frameElement.api.opener.document.getElementById("userNam ...

  8. python 元类(metaclass)

    元类参见老师的博客 http://www.cnblogs.com/linhaifeng/articles/8029564.html

  9. JVM调优之---一次GC调优实战

    某系统反馈『性能抖动,响应时间会突然飙高,TP999 MAX会到3000+』,初步怀疑是JVM FULL GC导致的 STW,观察FULL GC日志默认的JVM参数: -Xms4096m -Xmx40 ...

  10. 求最大连续和——dp

    输入一组整数,求出这组数字子序列和中最大值.也就是仅仅要求出最大子序列的和,不必求出最大的那个序列. 比如: 序列:-2 11 -4 13 -5 -2,则最大子序列和为20. 序列:-6 2 4 -7 ...