最近开发项目遇到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 设置延迟加载忽略引用 - DbContext dbContext = CallContext.GetData("DbContext") as DbContext;
- if (dbContext== null)
- {
- dbContext = new GuaZhouGovDbEntities();
- CallContext.SetData("DbContext", dbContext);
- }
- dbContext.Configuration.LazyLoadingEnabled = false; //liuwei 依赖虚拟属性防止Json转化陷入死循环 2020-03-05
- return dbContext;
复制代码然后此时返回的实体, 外键实体模型是 null 类型, 所以能彻底解决这个问题。 第二种, 如果我们需要外键属性表,参与主键表的数据查询,可以这样做,在Json转化的时候。 - JsonSerializerSettings settings = new JsonSerializerSettings();
- settings.Converters.Add(new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" });、
-
- settings.Formatting = Newtonsoft.Json.Formatting.Indented;
-
- settings.MaxDepth = 5; //liuwei 外键最大检索深度设置5 或者更低,取决于你的主外键关系
-
- settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; //liuwei 忽略循环引用
-
- return JsonConvert.SerializeObject(t, settings);
复制代码这样我们的Entity 主外键表信息可以完整保留,并成功转换成Json 模式,然后EasyUI 就可以成功绑定。
|