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 ...
随机推荐
- javascript闭包的使用--按钮切换
闭包实现按钮状态切换 看下面的代码: var toggleBtn = document.getElementById('toggle'); var toggleFun = (function() { ...
- Luogu4770 NOI2018 你的名字 SAM、主席树
传送门 UPD:发现之前被smy误导的一个细节,改过来之后就AC了-- 一道比较套路的SAM题,虽然我连套路都不会-- 先考虑前\(68pts\),也就是\(l=1 , r=|S|\)的情况.我们对\ ...
- VS2015 搭建 Asp.net core 开发环境
1.首先你得装个vs2015 并且保证已经升级至 update3及以上(此处附上一个vs2015带up3的下载链接: ed2k://|file|cn_visual_studio_enterprise_ ...
- Nagios数据存储插件NDOUtils部署和测试
1. 概述 NDOUTILS,Nagios Data Output Utils,Nagios数据输出工具,允许用户从Nagios导出状态和事件信息到数据库中,便于以后的检索和加工 它包括几个部分: N ...
- macaca使用中问题解决方法整理
报告老板:很多同学在搭建macaca的环境时候,出现了各种问题,尤其是使用windows的同学,更是复杂且费劲的要命,我这里针对一些遇到的坑,按照从头的搭建开始说起,如下 基本的搭建条件要满足基础环境 ...
- Salesforce随笔: 将Visualforce Page导出为 Excel/CSV/txt (Display a page in Excel)
想要实现如题所述功能,可以参照 : Visualforce Developer Guide 第57页中所举的例子,在<apex:page>标签中添加contentType属性. <a ...
- Websocket(一)——原理及基本属性和方法
初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起. 举例 ...
- use_frameworks!和#use_frameworks!的区别、解决Swift项目中use_frameworks!冲突的问题
use_frameworks!和#use_frameworks!的区别 转自:https://www.jianshu.com/p/0ae58a477459 1. 用cocoapods 导入swift ...
- Lotto HDU
链接 [http://acm.hdu.edu.cn/showproblem.php?pid=1342] 题意 分析 DFS 代码 #include<cstdio> #include< ...
- 我的github地址
链接:https://github.com/long0123/test.git 推送项目的github的大致步骤如下: 1.在本地创建一个项目仓库,可以放些基本的项目文件 2.cd至该目录下 3. ...