框架不同 原理相同 举例使用前端框架 layui 后端mvc+EF
因为 EF模型中的主外键 有循环的关系 一般通过ef取查询表时常常引发循环问题
解决方案
- 延迟加载导航属性 直到访问时才会去加载导航属性
//关闭 上下文配置.是否启用针对导航属性的关系的延迟加载。导航属性的延迟加载
db.Configuration.LazyLoadingEnabled = false; //两者效果相似 选其一
// 禁用加载模型的导航属性 (就不会触发主外键关系)
db.Configuration.ProxyCreationEnabled = false;
//现在的plist 再去展示列表的时候 就会忽略模型的导航属性 也不会进行循环调用了
List<PaperTypes> plist = db.PaperTypes.ToList();
需要注意的是,当ProxyCreationEnabled =false的时候,LazyLoadingEnabled是不起作用的。
- 使用Linq语句取结果集
linq获取结果集 就已经不是从上下文类直接获取的模型了 自然直接跳过 模型的主外键关系
//
var plistLinq = (from p in db.PaperTypes
select new {
p.PaperTypeId,
p.Name,
p.CreateTime,
p.IsDelete
}).ToList();
- 忽略循环引用
序列化对象时,如果该对象的属性值也是对象,就会出现循环引用的情况
jsSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore
在序列化对象时忽略循环引用,避免出现循环引用的问题
//实例化 jsSettings 对象
JsonSerializerSettings jsSettings = new JsonSerializerSettings();
//配置jsSettings 的ReferenceLoopHandling 属性 使其序列化时忽略 循环引用
jsSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
//返回序列化后的json数据
return JsonConvert.SerializeObject(json, jsSettings);