文章内容
2017/9/26 17:23:03,作 者: 黄兵
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);
本文转载自:Redis无法保存ef复杂对象
评论列表