EF提示“序列化类型为XXX的对象时检测到循环引用”(转载)
今天在做MVC项目的时候,由于需要将对象转换为Json值,使用的代码如下:
- public ActionResult QuaryOrders()
- {
- var dataOrder = db.OrderDetails.Include(n => n.Product);
- return Json(dataOrder, JsonRequestBehavior.AllowGet);
- }
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);
- }
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);
- }
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
树立目标,保持活力,gogogo!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具