zoukankan      html  css  js  c++  java
  • Redis无法保存ef复杂对象

    最近项目需要使用redis。

    然后我就满怀激情开始处理数据层了。在原来查询数据的基础上,有封装了一个redis缓存层。

    结果在redis保存ef对象的时候,发现了一个非常尴尬的问题。


    model:

    public partial class SYS_User
        {
            public SYS_User()
            {
                this.SYS_UserAccess = new HashSet<SYS_UserAccess>();
            }
    
    
            [Key]
            public int UserID { get; set; }
            public Nullable<int> CompanyID { get; set; }
            public string Email { get; set; }
    
            [ForeignKey("CompanyID")]
            public virtual COM_Company COM_Company { get; set; }
            public virtual ICollection<SYS_UserAccess> SYS_UserAccess { get; set; }
        }
    

    然后使用  

    client.Set<SYS_User>("test", user);

    结果就失败了。错误是:无限死循环。



    然后我又尝试了另一个

    model

    public partial class COM_HsCode
        {
            [Key]
            public string ID{ get; set; }
            public string Hc_Unit1 { get; set; }
            public string Hc_Unit2 { get; set; }
    
        }


    结果发现,如果不是带有主外键的复杂实体,那么保存是可以成功的


    最后无奈之下,是在没有什么好办法(如果大家有好办法,请给我留言!!!)
    最终解决方案是,把对象序列化为json,然后保存到redis中。

    但是保存前,需要让Json不去序列化主外键关系表(增加[JsonIgnore] 属性)。

    public partial class SYS_User
        {
            public SYS_User()
            {
                this.SYS_UserAccess = new HashSet<SYS_UserAccess>();
            }
    
    
            [Key]
            public int UserID { get; set; }
            public Nullable<int> CompanyID { get; set; }
            public string Email { get; set; }
    
                [JsonIgnore]
            [ForeignKey("CompanyID")]
            public virtual COM_Company COM_Company { get; set; }
                [JsonIgnore]
            public virtual ICollection<SYS_UserAccess> SYS_UserAccess { get; set; }
        }

    redis:

    ELDBEntity ef = new ELDBEntity();
                //获取数据
                var q = ef.Set<SYS_User>().ToList();
                //序列化
                string s = JsonConvert.SerializeObject(q);
                //保存
                client.Set<string>("test", s);
                //redis获取
                var w = client.Get<string>("test");
                //反序列化
                var d = JsonConvert.DeserializeObject<List<SYS_User>>(w);





  • 相关阅读:
    爬虫笔记:PyQuery模块(七)
    25丨固若金汤的根本(下):数字签名与证书
    爬虫笔记:Beautiful Soup 使用(六)
    24丨固若金汤的根本(上):对称加密与非对称加密
    爬虫笔记:requests模块使用(四)
    五安全篇(7讲)23-TLS又是什么?
    爬虫笔记:http请求详解(三)
    22丨冷链周转:HTTP的缓存代理
    python中expandtabs()函数的用法
    Python全栈工程师(while、占位符)
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/9779854.html
Copyright © 2011-2022 走看看