最近项目需要使用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复杂对象的更多相关文章

  1. Redis如何保存数组和对象

    个人建议使用PHP自带的序列化函数serialize和unserialize函数 我们可以封装一个自己的Redis类 <?php class MyRedis{ private static $h ...

  2. EF上下文对象线程内唯一性与优化

    在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,这也加是很多人的代码中习惯在使用上下文对象时,习惯将对象建立在using中,也是为了尽早释放上下文对象, 但是如果有一个业务逻辑调用 ...

  3. 【无私分享:ASP.NET CORE 项目实战(第二章)】添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 上一章,我们介绍了安装和新建控制器.视图,这一章我们来创建个数据模型,并且添加接口和实现类. 添加EF上下文对象 按照我们以前 ...

  4. 添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)

    添加EF上下文对象,添加接口.实现类以及无处不在的依赖注入(DI) 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 上一章,我们介绍了安装和新建控制器.视图,这一章我们来创建 ...

  5. 从Redis中删除大集合对象的方法

    Redis中的大集合对象,如set.zset等,如果有上千万个元素,一般是不能直接用del命令来删除的,因为del命令可能会耗时几秒钟,而redis本身是单线程的,在高并发的情况下会阻塞大量的请求,严 ...

  6. Redis 的底层数据结构(对象)

    目前为止,我们介绍了 redis 中非常典型的五种数据结构,从 SDS 到 压缩列表,这都是 redis 最底层.最常用的数据结构,相信你也掌握的不错. 但 redis 实际存储键值对的时候,是基于对 ...

  7. Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)

    Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式) 原文地址:http://alanland.iteye.com/admin/blogs/1600685(欢迎转载 ...

  8. Redis应用场景 及其数据对象 string hash list set sortedset

    原文地址:http://www.cnblogs.com/shanyou/archive/2012/09/04/2670972.html Redis开创了一种新的数据存储思路,使用Redis,我们不用在 ...

  9. Android SharedPreferences保存和读取对象

    SharedPreferences保存和读取对象 1.首先要序列化对象(以下是序列化实体类的样例,不方便贴出实体类全部的代码) public class LoginResult extends Bas ...

随机推荐

  1. Swift开发iOS项目实战视频教程(二)---图片与动画

    本课主要介绍UIImageview.NSTimer的使用.并介绍了一种动画实现方式. 本教程摒弃枯燥的语法和知识解说.全是有趣有料的项目实战! 视频优酷链接:v.youku.com/v_show/id ...

  2. BusyBox下tftp命令的使用

    一.简介 BusyBox下的tftp是一款应用于嵌入式开发系统上的一款小巧tftp工具,为开发者提供一个tftp服务的使用平台. 通常是,PC开发主机作为服务器(Server),开发系统(板)作为客户 ...

  3. UOJ224 NOI2016 旷野大计算 构造、造计算机

    传送门——UOJ 传送门——Luogu 这段时间请不要找Itst聊天,Itst已经做疯了 事实证明大模拟题不可做 query 1 送分,加起来一起乘即可 I I + < - O query 2 ...

  4. 在WPF中使用FontAwesome图标字体

    原文:在WPF中使用FontAwesome图标字体 版权声明:原创内容转载必须注明出处,否则追究相关责任. https://blog.csdn.net/qq_36663276/article/deta ...

  5. NOI Day1线上同步赛梦游记

    Preface 第一次体验NOI,虽然不是正式选手,但是打打同步赛还是挺涨姿势的,也算是体验了一把. Day1很爆炸,一方面是NOI题目的难度高于自身的水平,另一方面也出现了比较大的失误,T1一个数组 ...

  6. EZ 2018 06 24 NOIP2018 模拟赛(二十)

    很久之前写的一套题了,由于今天的时间太多了,所以记起来就写掉算了. 这一场尽管T2写炸了,但也莫名Rank4涨了Rating.不过还是自己太菜. A. 环游世界 首先我们先排个序,想一下如果不用走回来 ...

  7. hibernate 解决 java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.validator.internal.engine.xxx 这类的问题

    <!-- 解决 java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.validator.intern ...

  8. 磁盘挂载问题:Fdisk最大只能创建2T分区的盘,超过2T使用parted

    需求说明:云服务器上买了一块8T的磁盘,准备挂载到服务器上的/data目录下. ===================================parted命令说明=============== ...

  9. vue element ui 导航刷新 is-active

    <el-menu :default-active="$route.path" router mode="horizontal"> <el-me ...

  10. 个人阅读作业——软件工程M1/M2的总结

    临近学期末,本学期的软件工程课也已经结束了,在此我对软件工程课中,我们团队M1和M2开发阶段中,我做的工作做一个总结 我是DEV,主要工作是等着上级给我分配任务,但是很多时候如果这个活我不干,其他人就 ...