ef entity转json引起的Self referencing loop

Posted 叶长种-.Net软件工程师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ef entity转json引起的Self referencing loop相关的知识,希望对你有一定的参考价值。

问题简介:前段时间做项目时,将取到的entity往Redis cache里存放时报多重引用的错误。

Self referencing loop detected for property \'CheckItemCategory\' with type。

一、问题详情

1、chectItemCategory与CheckItem实体介绍

    

 

 

2、我们用ef取了List<CheckItemCategory>,以Json的形式存放到redis中。但在JsonConvert.SerializeObject时报多重引用错误。

 

3、细追原因,NewtonSoft.Json 对Entity(CheckItemCategory)序列化时,会遍历CheckItemCategory中的所有属性进行转换。当遇到导航属性CheckItems时,会向数据库继续请求checkItems数据(ef延迟加载)。而在转换checkItem实体时,checkItem实体里面又有CheckItemCategory导航属性。CheckItemCategory与checkItem互相引用,多重引用死循环问题。

二、解决方案

1、方法1。推荐用这个。

在entity的checkItems导航属性上加[JsonIgnore]特性来忽略该属性。

 

关于newtonsoft.json高级用法参见 http://www.cnblogs.com/yanweidie/p/4605212.html

2、方法2。删除CheckItemCategory类中的checkItems属性。但是此方法治标不治本,(1)本来ef配置两者外键关系时需要用

(2)在具体应用时可能已经在用他们的关系延迟加载,进行业务操作。

(3)在取checkItem转json时也会将CheckItemCategory取出一并转到json中去,比较坑。

三、思维延伸

在用webapi返回结果时,千万不要直接返回entity,因为也会把导航属性全部取出。暴露了其他数据信息。

 

以上是关于ef entity转json引起的Self referencing loop的主要内容,如果未能解决你的问题,请参考以下文章

主键非自增列 EF 插入数据库引起的 ID 列不能为 NULL 的错误

java entity转js的json对象

《Entity Framework 6 Recipes》翻译系列 -----第一章 开始使用实体框架之历史和框架简述 (转)

如何解决fastjson把对象转化成json避免$ref

Entity Framework Extended Library (EF扩展类库,支持批量更新删除合并多个查询等)

序列化类型为“System.Data.Entity.DynamicProxies..."对象时检测到循环引用