• 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,因为也会把导航属性全部取出。暴露了其他数据信息。

  • 相关阅读:
    spring @resource @ Autowired
    mysql 。。。
    MYSQL
    oracle sql 性能 优化
    tomcat 解析(五)-Tomcat的核心组成和启动过程
    tomcat 解析(四)-处理http请求过程
    tomcat 解析(三)-启动框架
    tomcat 解析(二)-消息处理过程
    tomcat 解析(一)-文件解析
    我发起并创立了一个 C 语言编译器 开源项目 InnerC
  • 原文地址:https://www.cnblogs.com/taoshengyujiu/p/7725510.html
Copyright © 2020-2023  润新知