zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Redis无法保存ef复杂对象

Redis对象 无法 保存 复杂 ef
2023-09-11 14:21:23 时间

最近项目需要使用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);