找回密码
 立即注册
查看: 37|回复: 0

C# ASP.NET MVC Entity 模型数据转换中遇到的问题

[复制链接]

15

主题

2

回帖

81

积分

管理员

积分
81
发表于 6 天前 | 显示全部楼层 |阅读模式
最近开发项目遇到ASP.NET MVC + Entity EasyUI 架构的后台, 需要将MODEL实体模型数据绑定到EasyUI 前台, 实体模型采用Entity 返回, 然后通过Newtonsoft.Json 将实体转换成json字符串返回。但是在转化的过程中却遇到实体模型因为外键引用出现转换过程死循环的问题。
错误提示:[color=rgb(78, 161, 219) !important]Newtonsoft.Json.JsonSerializationException:“Self referencing loop detected with type 'System.Data.Entity.DynamicProxies.Labels



提示的意思就是发生循环引用导致转换异常

解决的方法有两种:

第一种,如果我们本次Entity操作, 对外键表可以忽略,可以在DBContext 设置延迟加载忽略引用

  1. DbContext dbContext = CallContext.GetData("DbContext") as DbContext;

  2.         if (dbContext== null)
  3.         {
  4.             dbContext = new GuaZhouGovDbEntities();

  5.             CallContext.SetData("DbContext", dbContext);
  6.         }

  7.         dbContext.Configuration.LazyLoadingEnabled = false; //liuwei 依赖虚拟属性防止Json转化陷入死循环 2020-03-05

  8.         return dbContext;
复制代码

然后此时返回的实体, 外键实体模型是 null 类型, 所以能彻底解决这个问题。

第二种, 如果我们需要外键属性表,参与主键表的数据查询,可以这样做,在Json转化的时候。

  1. JsonSerializerSettings settings = new JsonSerializerSettings();

  2.        settings.Converters.Add(new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" });、
  3.       
  4.        settings.Formatting = Newtonsoft.Json.Formatting.Indented;
  5.       
  6.        settings.MaxDepth = 5;  //liuwei 外键最大检索深度设置5 或者更低,取决于你的主外键关系
  7.       
  8.        settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;  //liuwei  忽略循环引用
  9.       
  10.         return JsonConvert.SerializeObject(t, settings);
复制代码

这样我们的Entity 主外键表信息可以完整保留,并成功转换成Json 模式,然后EasyUI 就可以成功绑定。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|软件开发编程门户 ( 陇ICP备2024013992号-1|甘公网安备62090002000130号 )

GMT+8, 2024-12-5 10:43 , Processed in 0.057640 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表