一. 本地缓存

  从这个章节开始,介绍一下EF的一些高级特性,这里介绍的首先介绍的EF的本地缓存,在前面的“EF增删改”章节中介绍过该特性(SaveChanges一次性会作用于本地缓存中所有的状态的变化),在这里介绍一下本地缓存的另外一个用途。

  ① Find方法通过主键查询数据,主键相同的查询,只有第一次访问数据库,其它均从缓存中读取。

  ② 延迟加载的数据,在第一次使用的使用时访问数据库,后面无论再使用多少次,均是从内存中读取了。

             Console.WriteLine("--------------------------- 1.本地缓存属性   ------------------------------------");
db.Database.Log += c => Console.WriteLine(c);
//以下4个根据主键id查询,查询了一次,都存到本地缓存里了,所以user2不查询数据库,但user3的id不同,所以查询数据库
var user1 = db.Set<TestInfor>().Find("");
var user2 = db.Set<TestInfor>().Find("");
var user3 = db.Set<TestInfor>().Find("");

二. 立即加载

  这里的立即加载指单表,不含主外键的情况。

  所谓的立即加载就是代码执行的时候直接去数据库查询,与是否立即使用无关,查出来后放到本地缓存里,以后再次使用的时候,从本地缓存中读取。

  常见的立即加载的的标记:toList() 、FirstOrDefault() 。

         Console.WriteLine("--------------------------- 2.即时加载   ------------------------------------");

                 ////以下3个属于立即查询,所以每次都要查询数据库,不缓存
var user5 = db.Set<TestInfor>().Where(u => u.id == "").FirstOrDefault();
var user6 = db.Set<TestInfor>().Where(u => u.id == "").FirstOrDefault();
var user7 = db.Set<TestInfor>().Where(u => u.id == "").FirstOrDefault();

三. 延迟加载

这里的延迟加载指单表,不含主外键的情况。

1. 定义:只有我们需要数据的时候,才去数据库查询

  比如:我们需要根据条件判断,通过Where来拼接条件(IQueryable),在拼接的过程中,并没有访问数据库,只有在最终使用的时候,才访问数据库。

  特别注意:调用的时候要foreach循环来调用,只有第一次使用的时候去访问数据库,其它的都是从本地缓存中读取。

2. 禁用延迟加载的方法:

a:如果结果是集合,在拼接的结尾加 toList() ,其它类型调用其它方法

b:如果结果是单个实体,在拼接的结尾加 FirstOrDefault()

3. 好处:保证了数据的实时性,什么时候用,什么时候查询

4. 弊端:每用一次,就需要查询一次数据,服务器压力大

5. 延迟加载的实际开发场景:

分页要要经历where多个条件查询、skip、take、toList,如果每调用一个方法都连接一个数据库,那么在拼接过程中就访问了3次数据库,而且可能数据量非常多,所以这个时候使用延迟加载,只有在所有sql语句拼接完的最后一步才连接数据库。

总结:只要查询结果实现了IQueryable接口类的,那么查询结果都是延迟加载的。

           Console.WriteLine("--------------------------- 3.延迟加载   ------------------------------------");
IQueryable<TestInfor> user4 = db.Set<TestInfor>().Where(u => u.id != "");
IQueryable<TestInfor> user6 = db.Set<TestInfor>().Where(u => u.id != "");
foreach (var item in user4)
{
Console.WriteLine("我要从数据库中读取数据了:" + item.txt1);
}
foreach (var item in user4)
{
Console.WriteLine("我要从数据库中读取数据了2:" + item.txt1);
}
foreach (var item in user6)
{
Console.WriteLine("我要从数据库中读取数据了3:" + item.txt1);
}

延迟加载上述案例分析:

* IQueryable类型的 user4和user6, 都是延迟加载的,下面foreach第一次使用该对象的时候去数据库查询。

* 这里会有这么几个问题:

* ①:foreach第一次遍历的时候去数据库中查询user4,然后放到本地缓存里,后面无论循环多少次,都是从本地缓存中读取user4。

* ②:前两个foreach操控的对象都是user4,所以第二个foreach无论哪次循环,都是从本地缓存中读取

* ③:第三个foreach操控的对象是user6,同样是在foreach第一次循环的时候去数据库查询,所以在代码执行到第一个或第二个foreach的时候,

* 手动去数据库改数据,当执行到第三个foreach,查询出来的数据就是修改后的了。

第五节: EF高级属性(一) 之 本地缓存、立即加载、延迟加载(不含导航属性)的更多相关文章

  1. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

  2. EF如何操作内存中的数据以及加载相关联表的数据:延迟加载、贪婪加载、显示加载

    之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需要用的,这个系列讲讲如何使用EF操作数据库.老版本的EF主要是通过Ob ...

  3. 教你50招提升ASP.NET性能(十四):使用startMode属性来减少ASP.NET站点加载时间

    (25)Use the startMode attribute to reduce the load time for your ASP.NET site 招数25: 使用startMode属性来减少 ...

  4. 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性)

    一. 简介 上一个章节中,也介绍了立即加载和延迟加载,但上一个章节是针对单表而言的,不含外键,立即也好,延迟也好,都是指单表中的数据.但本章节重点介绍的三种加载方式均是针对含(导航属性.外键)的情况下 ...

  5. ef延迟加载不到导航属性问题

    最近做项目踩到了一个ef问题上的坑,导航属性(外键关键,如子表或主表等)“.”出来后是Null,外键值也对,数据库和ef的关系配置也都正确,就是加载不出来.后来发现实体里导航属性前少了个virtual ...

  6. EF实体框架-从数据库更新模型 一部分表的外键(导航属性)无法显示

    从数据库更新模型 要想让数据库表之间的外键关系 显示到实体模型的导航属性中去. 表的外键 对应另一张表的字段要是主键,唯一键显示不出来

  7. js 实现图片预加载 (js操作 Image对象属性complete ,事件onload 异步加载图片)

    通过js操纵DOM很多情况下都是为了实现和当前页html元素的异步载入,我谈谈对Image对象的一些认识.看个例子:<input type="button" name=&qu ...

  8. Java学习笔记之——this关键字、非静态成员属性和静态成员属性的区别、类的加载顺序

    一.this关键字 1.代表当前类的对象 2.通过” . ”调用成员属性和成员方法 3.通过this可以区分成员属性和参数 参数名和属性名相同的情况,默认是参数名 二.非静态成员属性和静态成员属性的区 ...

  9. EasyDSS高性能流媒体服务器前端重构(五)- webpack + vue-router 开发单页面前端实现按需加载 - 副本

    为了让页面更快完成加载, 第一时间呈现给客户端, 也为了帮助客户端节省流量资源, 我们可以开启 vue-router 提供的按需加载功能, 让客户端打开页面时, 只自动加载必要的资源文件, 当客户端操 ...

随机推荐

  1. vmware station-ubuntu18.04 共享剪贴板

    辞职在家休息,买了台新电脑,装个虚拟机,安装visual studio, android studio, qt, everything, noptepad++,hbuilder,ditto,xx-ne ...

  2. C# -- 使用委托 delegate 执行异步操作

    C# -- 使用委托 delegate 执行异步操作 委托是一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似. 与 C 中的函数指针不同,委托是面向对象的.类型安全的和保险的. 委托的 ...

  3. 超哥笔记 --nginx入门(6)

    一 NGINX 1 nignx是什么 nginx是一个开源的支持高性能,高并发的web服务和代理服务软件. nginx比他大哥apache性能改进许多,nginx占用的系统资源更少,支持高并发连接,有 ...

  4. 新的编辑工具IDE

    因为最近一段时间前端都是用EXTJS开发,之前用vs2012来编辑extjs,感觉缺少智能感应,很不方便.后来发现一款工具Visual Studio Code,非常棒. VS Code是免费,轻量,跨 ...

  5. JavaScript-创建日志调试对象(面向对象实例)

    参考自http://www.2cto.com/kf/201312/261990.html IC.js文件 自己封装的js类库 /** * * @authors Your Name (you@examp ...

  6. react组件之间的通信

    通过props传递 共同的数据放在父组件上, 特有的数据放在自己组件内部(state),通过props可以传递一般数据和函数数据, 只能一层一层传递 一般数据-->父组件传递数据给子组件--&g ...

  7. Lightoj 1128 - Greatest Parent

    Gate 倍增模板,在一个严格小根堆中,给定$x,y$,求$x$的祖先中$≥y$的最高点. 注意清零 #include<cstdio> #include<iostream> # ...

  8. Python—kmeans算法学习笔记

    一.   什么是聚类 聚类简单的说就是要把一个文档集合根据文档的相似性把文档分成若干类,但是究竟分成多少类,这个要取决于文档集合里文档自身的性质.下面这个图就是一个简单的例子,我们可以把不同的文档聚合 ...

  9. win10下ElasticSearch5.5.1与head、Kibana、X-Pack、SQL、IK、PINYIN插件的配置安装

    ElasticSearch5.5.1与插件的配置安装 Elasticsearch5.5.1安装: 下载地址https://www.elastic.co/cn/downloads/elasticsear ...

  10. PS图片后期之超简易造光调色方法

    技法是死的,而人是活的,说的简单一点就是我们要学会开拓一下思维,调色的方法并不是只有[可选颜色]而已. 在修片之前,我们先要学会分析,在拍摄这一组照片时我希望有一种夕阳的光穿透晒在脸庞的感觉,而左边的 ...