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复杂对象的更多相关文章
- Redis如何保存数组和对象
个人建议使用PHP自带的序列化函数serialize和unserialize函数 我们可以封装一个自己的Redis类 <?php class MyRedis{ private static $h ...
- EF上下文对象线程内唯一性与优化
在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,这也加是很多人的代码中习惯在使用上下文对象时,习惯将对象建立在using中,也是为了尽早释放上下文对象, 但是如果有一个业务逻辑调用 ...
- 【无私分享:ASP.NET CORE 项目实战(第二章)】添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 上一章,我们介绍了安装和新建控制器.视图,这一章我们来创建个数据模型,并且添加接口和实现类. 添加EF上下文对象 按照我们以前 ...
- 添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)
添加EF上下文对象,添加接口.实现类以及无处不在的依赖注入(DI) 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 上一章,我们介绍了安装和新建控制器.视图,这一章我们来创建 ...
- 从Redis中删除大集合对象的方法
Redis中的大集合对象,如set.zset等,如果有上千万个元素,一般是不能直接用del命令来删除的,因为del命令可能会耗时几秒钟,而redis本身是单线程的,在高并发的情况下会阻塞大量的请求,严 ...
- Redis 的底层数据结构(对象)
目前为止,我们介绍了 redis 中非常典型的五种数据结构,从 SDS 到 压缩列表,这都是 redis 最底层.最常用的数据结构,相信你也掌握的不错. 但 redis 实际存储键值对的时候,是基于对 ...
- Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)
Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式) 原文地址:http://alanland.iteye.com/admin/blogs/1600685(欢迎转载 ...
- Redis应用场景 及其数据对象 string hash list set sortedset
原文地址:http://www.cnblogs.com/shanyou/archive/2012/09/04/2670972.html Redis开创了一种新的数据存储思路,使用Redis,我们不用在 ...
- Android SharedPreferences保存和读取对象
SharedPreferences保存和读取对象 1.首先要序列化对象(以下是序列化实体类的样例,不方便贴出实体类全部的代码) public class LoginResult extends Bas ...
随机推荐
- hibernate4使用原生jdbc进行批处理
在hibernate中,有一级缓存session和二级缓存sessionFactory这些机制,一方面为编码提供了便利,同时也会有一些副作用.比如有较大的数据量交互的话,缓存反而会降低效率.最近在做一 ...
- 驱动笔记 - platform中断程序
platform_device: #include <linux/module.h> #include <linux/types.h> #include <linux/f ...
- char.IsLetter的使用
先看一下下面的代码,大家会觉得控制台输出什么? 输出:Chiantxt .对吗? 因为你看到char.IsLetter这个方法的文字的注释是这样写的: 但实际上输出的结果是这样的: ??? 怎么还输 ...
- CF666E Forensic Examination 广义SAM、线段树合并、倍增、扫描线
传送门 朴素想法:对\(M\)个匹配串\(T_1,...,T_M\)建立广义SAM,对于每一次询问,找到这个SAM上\(S[pl...pr]\)对应的状态,然后计算出对于每一个\(i \in [l,r ...
- SPOJ Qtree系列 5/7
Qtree1 树剖裸题 注意把边权移到深度较深的点上,树剖跳的时候不要将LCA的答案统计上就行了 #include<stdio.h> #include<string.h> #d ...
- CF1038E Maximum Matching 搜索/区间DP
题目传送门:http://codeforces.com/problemset/problem/1038/E 题意:给出$N$个方块,每个方块有左右两种颜色$a,b$(可以翻转使左右两种颜色交换)和一个 ...
- Cordova套网站
用Cordova套网站,只修改Content的话,打包后的App,在点击后会打开浏览器,并没有在App中显示内容. 需要设置allow-navigation为 * <?xml version=' ...
- [Partition][Index]对于Partition表而言,是否Global Index 和 Local Index 可以针对同一个字段建立?
对于Partition表而言,是否Global Index 和 Local Index 可以针对同一个字段建立? 实验证明,对单独的列而言,要么建立 Global Index, 要么建立 Local ...
- PMO在组织中实现价值应做的工作
PMO在组织中实现价值应做的工作 研发人员及项目经理常常对PMO有反感情绪,认为其不熟悉业务流程与技术.经常要求项目经理和研发人员提交形式化的材料,只审批和监控,不能为项目提供良好的服务.在很多企业, ...
- Session配置之WebApi支持
1.在WebApiConfig中建立建立HttpControllerHandler和HttpControllerRouteHandler 并覆写它 public class SessionRouteH ...