文章内容

2017/9/26 17:23:03,作 者: 黄兵

Redis无法保存ef复杂对象

最近项目需要使用redis。

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

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

model:

  1. public partial class SYS_User  
  2.     {  
  3.         public SYS_User()  
  4.         {  
  5.             this.SYS_UserAccess = new HashSet<SYS_UserAccess>();  
  6.         }  
  7.   
  8.   
  9.         [Key]  
  10.         public int UserID { getset; }  
  11.         public Nullable<int> CompanyID { getset; }  
  12.         public string Email { getset; }  
  13.   
  14.         [ForeignKey("CompanyID")]  
  15.         public virtual COM_Company COM_Company { getset; }  
  16.         public virtual ICollection<SYS_UserAccess> SYS_UserAccess { getset; }  
  17.     }  

然后使用  

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

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


然后我又尝试了另一个

model

  1. public partial class COM_HsCode  
  2.     {  
  3.         [Key]  
  4.         public string ID{ getset; }  
  5.         public string Hc_Unit1 { getset; }  
  6.         public string Hc_Unit2 { getset; }  
  7.   
  8.     }  

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


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

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

  1. public partial class SYS_User  
  2.     {  
  3.         public SYS_User()  
  4.         {  
  5.             this.SYS_UserAccess = new HashSet<SYS_UserAccess>();  
  6.         }  
  7.   
  8.   
  9.         [Key]  
  10.         public int UserID { getset; }  
  11.         public Nullable<int> CompanyID { getset; }  
  12.         public string Email { getset; }  
  13.   
  14.             [JsonIgnore]  
  15.         [ForeignKey("CompanyID")]  
  16.         public virtual COM_Company COM_Company { getset; }  
  17.             [JsonIgnore]  
  18.         public virtual ICollection<SYS_UserAccess> SYS_UserAccess { getset; }  
  19.     }  

redis:

  1. ELDBEntity ef = new ELDBEntity();  
  2.             //获取数据  
  3.             var q = ef.Set<SYS_User>().ToList();  
  4.             //序列化  
  5.             string s = JsonConvert.SerializeObject(q);  
  6.             //保存  
  7.             client.Set<string>("test", s);  
  8.             //redis获取  
  9.             var w = client.Get<string>("test");  
  10.             //反序列化  
  11.             var d = JsonConvert.DeserializeObject<List<SYS_User>>(w);  

本文转载自:Redis无法保存ef复杂对象

分享到:

发表评论

评论列表