最近项目需要使用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. ASP.NET Core 防止跨站请求伪造(XSRF/CSRF)攻击 (转载)

    什么是反伪造攻击? 跨站点请求伪造(也称为XSRF或CSRF,发音为see-surf)是对Web托管应用程序的攻击,因为恶意网站可能会影响客户端浏览器和浏览器信任网站之间的交互.这种攻击是完全有可能的 ...

  2. Luogu4640 BJWC2008 王之财宝 容斥、Lucas

    传送门 题意:有$N$种物品,其中$T$个物品有限定数量$B_i$,其他则没有限定.问从中取出不超过$M$个物品的方案数,对质数$P$取模.$N,M \leq 10^9 , T \leq 15 , P ...

  3. BootStrap学习(3)_导航菜单

    一.导航元素 1.表格导航或标签 以一个带有 class .nav 的无序列表开始. 添加 class .nav-tabs. <!DOCTYPE html> <html xmlns= ...

  4. Luogu P1337 [JSOI2004]平衡点 / 吊打XXX

    一道入门模拟退火的经典题,还是很考验RP的 首先我们发现神TM这道题又和物理扯上了关系,其实是一道求广义费马点的题目 首先我们可以根据物理知识得到,当系统处于平衡状态时,系统的总能量最小 又此时系统的 ...

  5. .net core实践系列之短信服务-为什么选择.net core(开篇)

    前言 从今天我将会写.net core实战系列,以我最近完成的短信服务作为例子.该系列将会尽量以最短的时间全部发布出来.源码也将优先开源出来给大家. 源码地址:https://github.com/S ...

  6. .net core实践系列之短信服务-Sikiro.SMS.Api服务的实现

    前言 上篇<.net core实践系列之短信服务-架构设计>介绍了我对短信服务的架构设计,同时针对场景解析了我的设计理念.本篇继续讲解Api服务的实现过程. 源码地址:https://gi ...

  7. windows如何查看电脑开关机记录

    如何查看电脑开关机记录 (一)如果你只是想查看一下,从昨天关机到今天开机之间有没有人使用我的计算机,在“开始”菜单的运行”中输入“eventvwr.msc”,或者是按下"开始菜单" ...

  8. C_数据结构_循环队列

    # include <stdio.h> # include <malloc.h> typedef struct Queue { int * pBase; int front; ...

  9. git-两小时简单使用教程

    两小时学会Git玩转Github 1. 了解Git和Github 1.1什么是Git Git是一个免费.开源的版本控制软件 1.2什么是版本控制系统 版本控制是一种记录一个或若干个文件内容变化,以便将 ...

  10. Python-元组-10

    元祖 Why:对于容器型数据类型list,无论谁都可以对其增删改查,那么有一些重要的数据放在list中是不安全的,所以需要一种容器类的数据类型存放重要的数据,创建之初只能查看而不能增删改,这种数据类型 ...