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

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


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

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


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

解决方法有两种:

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

       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对象,转换后对数据会包含转义字符“\”:

       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中决序列化的循环引用问题,本文着重描述使用匿名内部类解决,其他方法可以上网搜索,谢谢!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值