博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF提示“序列化类型为XXX的对象时检测到循环引用”(转载)
阅读量:4622 次
发布时间:2019-06-09

本文共 2034 字,大约阅读时间需要 6 分钟。

 

今天在做MVC项目的时候,由于需要将对象转换为Json值,使用的代码如下:

 

 
  1. public ActionResult QuaryOrders()  
  2.  {  
  3.      var dataOrder = db.OrderDetails.Include(n => n.Product);           
  4.      return Json(dataOrder, JsonRequestBehavior.AllowGet);   
  5.  }  
public ActionResult QuaryOrders()        {            var dataOrder = db.OrderDetails.Include(n => n.Product);                     return Json(dataOrder, JsonRequestBehavior.AllowGet);         }

 

但EF提示“序列化类型为XXX的对象时检测到循环引用”,截图如下:

产生这种的原因是Entity Framework两个模型之间进行了相互引用,就是说这两个在数据中的表有主外键关系的

解决方法有两种:

方法一:使用匿名类来传递对象:

 

[csharp]
  1. public ActionResult QuaryOrders()  
  2.  {  
  3.      var dataOrder = db.OrderDetails.Include(n => n.Product).Select(n => new { Id=n.Id ,OrderId = n.OrderId});           
  4.      return Json(dataOrder, JsonRequestBehavior.AllowGet);   
  5.  }  
public ActionResult QuaryOrders()        {            var dataOrder = db.OrderDetails.Include(n => n.Product).Select(n => new { Id=n.Id ,OrderId = n.OrderId});                     return Json(dataOrder, JsonRequestBehavior.AllowGet);         }

 

方法二:使用命名空间Newtonsoft.Json(该程序集可以使用Nuget来下载)中的方法来序列化Json对象,转换后对数据会包含转义字符“\”:

 

 
  1. public ActionResult QuaryOrders()  
  2.  {  
  3.      JsonSerializerSettings setting = new JsonSerializerSettings()  
  4.      {  
  5.          ReferenceLoopHandling = ReferenceLoopHandling.Ignore,  
  6.          Formatting = Formatting.None  
  7.      };  
  8.      var ret = JsonConvert.SerializeObject(dataOrder, setting);  
  9.      return Json(ret, JsonRequestBehavior.AllowGet);  
  10.  }  
public ActionResult QuaryOrders()        {            JsonSerializerSettings setting = new JsonSerializerSettings()            {                ReferenceLoopHandling = ReferenceLoopHandling.Ignore,                Formatting = Formatting.None            };            var ret = JsonConvert.SerializeObject(dataOrder, setting);            return Json(ret, JsonRequestBehavior.AllowGet);        }
补充:MVC中使用JSON的时候(考虑运行Get请求方式和导航属性造成的循环引用),在使用Get请求的使用要使用Json(ret, JsonRequestBehavior.AllowGet)方法,而由于导航属性造成的循环引用应该首先考虑使用匿名内部类来解决,也可以使用Json序列化工具Newtonsoft.Json中决序列化的循环引用问题,本文着重描述使用匿名内部类解决,其他方法可以上网搜索,谢谢!
 
来源:http://blog.csdn.net/yzj_xiaoyue/article/details/64124446

转载于:https://www.cnblogs.com/hao-1234-1234/p/8366271.html

你可能感兴趣的文章
提高夜晚学习效率的建议
查看>>
js循环给li绑定事件实现 点击li弹出其索引值 和内容
查看>>
meclipse6.5破解
查看>>
对下拉框的某些下拉选项进行删除操作--remove(selectIndex)
查看>>
js获取鼠标当前的位置
查看>>
LLVM 初探<一>
查看>>
【POJ-2482】Stars in your window 线段树 + 扫描线
查看>>
14.不同条目的listview
查看>>
如何依靠代码提高网络性能
查看>>
Fedora 17 无线网卡配置笔记
查看>>
NYOJ 17 单调递增最长子序列
查看>>
[HNOI 2001]求正整数
查看>>
plsql出现录相机后卡屏解决方法
查看>>
HDU 1004 Let the Balloon Rise
查看>>
Codeforces 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses
查看>>
numpy.random.shuffle()与numpy.random.permutation()的区别
查看>>
asp:UpdatePanel中js失效问题已解决
查看>>
Vue项目创建build后可修改的配置文件
查看>>
webRTC中音频相关的netEQ(四):控制命令决策
查看>>
es6代理 proxy 学习
查看>>