zoukankan      html  css  js  c++  java
  • EF提示“序列化类型为XXX的对象时检测到循环引用”(转载)

     

    今天在做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两个模型之间进行了相互引用,就是说这两个在数据中的表有主外键关系的

    解决方法有两种:

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

    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
  • 相关阅读:
    人生如此
    微软十七道智力面试题及答案
    【Flink系列十】Flink作业提交过程的调试和诊断
    【Flink系列九】Flink 作业提交遇到的问题记录以及原理
    Jackson ObjectMapper JSON序列化工具使用笔记,由浅入深
    既有设计模式的lambda重构
    观察者模式/Observer
    函数式接口java.util.function
    面向对象世界的七个设计原则
    重构-改善既有代码设计读后灵光
  • 原文地址:https://www.cnblogs.com/hao-1234-1234/p/8366271.html
Copyright © 2011-2022 走看看