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);





  • 相关阅读:
    BZOJ 3709: [PA2014]Bohater
    BZOJ 3689: 异或之
    BZOJ 4385: [POI2015]Wilcze doły
    2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017) Solution
    Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3) Solution
    BZOJ 4320: ShangHai2006 Homework
    BZOJ 4318: OSU!
    2016-2017 ACM-ICPC CHINA-Final Solution
    BZOJ 5312: 冒险
    Codeforces Round #520 (Div. 2) Solution
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/9779854.html
Copyright © 2011-2022 走看看