最近项目需要使用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. hibernate4使用原生jdbc进行批处理

    在hibernate中,有一级缓存session和二级缓存sessionFactory这些机制,一方面为编码提供了便利,同时也会有一些副作用.比如有较大的数据量交互的话,缓存反而会降低效率.最近在做一 ...

  2. 驱动笔记 - platform中断程序

    platform_device: #include <linux/module.h> #include <linux/types.h> #include <linux/f ...

  3. char.IsLetter的使用

    先看一下下面的代码,大家会觉得控制台输出什么? 输出:Chiantxt  .对吗? 因为你看到char.IsLetter这个方法的文字的注释是这样写的: 但实际上输出的结果是这样的: ??? 怎么还输 ...

  4. CF666E Forensic Examination 广义SAM、线段树合并、倍增、扫描线

    传送门 朴素想法:对\(M\)个匹配串\(T_1,...,T_M\)建立广义SAM,对于每一次询问,找到这个SAM上\(S[pl...pr]\)对应的状态,然后计算出对于每一个\(i \in [l,r ...

  5. SPOJ Qtree系列 5/7

    Qtree1 树剖裸题 注意把边权移到深度较深的点上,树剖跳的时候不要将LCA的答案统计上就行了 #include<stdio.h> #include<string.h> #d ...

  6. CF1038E Maximum Matching 搜索/区间DP

    题目传送门:http://codeforces.com/problemset/problem/1038/E 题意:给出$N$个方块,每个方块有左右两种颜色$a,b$(可以翻转使左右两种颜色交换)和一个 ...

  7. Cordova套网站

    用Cordova套网站,只修改Content的话,打包后的App,在点击后会打开浏览器,并没有在App中显示内容. 需要设置allow-navigation为 * <?xml version=' ...

  8. [Partition][Index]对于Partition表而言,是否Global Index 和 Local Index 可以针对同一个字段建立?

    对于Partition表而言,是否Global Index 和 Local Index 可以针对同一个字段建立? 实验证明,对单独的列而言,要么建立 Global Index, 要么建立 Local ...

  9. PMO在组织中实现价值应做的工作

    PMO在组织中实现价值应做的工作 研发人员及项目经理常常对PMO有反感情绪,认为其不熟悉业务流程与技术.经常要求项目经理和研发人员提交形式化的材料,只审批和监控,不能为项目提供良好的服务.在很多企业, ...

  10. Session配置之WebApi支持

    1.在WebApiConfig中建立建立HttpControllerHandler和HttpControllerRouteHandler 并覆写它 public class SessionRouteH ...