数据加载分为延迟加载和预加载

EF的关联实体加载有三种方式:Lazy Loading,Eager Loading,Explicit Loading,其中Lazy LoadingExplicit Loading都是延迟加载。

(一)Lazy Loading使用的是动态代理,关闭Lazy Loading,可以将LazyLoadingEnabled设为false,如果导航属性没有标记为virtual,Lazy Loading也是不起作用的。

(二)Eager Loading使用Include方法关联预先加载的实体。

(三)Explicit Loading使用Entry方法,对于集合使用Collection,单个实体则使用Reference。

延迟加载:

以上一章的产品和发票为例:

            //延迟加载
context.Configuration.ProxyCreationEnabled = true;
context.Configuration.LazyLoadingEnabled = true;
//此时不会加载SysInvoice属性关联的对象
var productGet = context.Set<Product>().First(r => r.Id == );
//直到用到SysInvoice时,才会新起一个查询获取Invoice
var date = productGet.SysInvoice.CreateDate;

作为默认配置的延迟加载,需要满足以下几个条件:

  1. context.Configuration.ProxyCreationEnabled = true;

  2. context.Configuration.LazyLoadingEnabled = true;

  3. 导航属性被标记为virtual

这三个条见缺一不可。(把导航属性virtual去掉可以禁用单个实体的延迟加载。)

如果不满足条件,延迟加载则不会启用,这时候我们必须使用手动加载的方式来获取关联数据。

手动加载就是通过DbReferenceEntry的Load方法来实现。我们把设置context.Configuration.LazyLoadingEnabled = false;(全局禁用延迟加载)以便在没有延迟加载的环境进行测试。

            //关闭延迟加载,手动加载(并且去掉SysInvoice导航属性virtual)
context.Configuration.ProxyCreationEnabled = false;
context.Configuration.LazyLoadingEnabled = false; //此时不会加载SysInvoice属性关联的对象
var productGet2 = context.Set<Product>().First(r => r.Id == );

默认情况下我们很少会直接用到Load方法,一般ToList或First这样的方法就帮我们完成加载数据操作了。

预加载:

预加载就是使用Include方法并传入需要同时获取的关联属性。我们也可以使用字符串传入属性的名称

            //预加载
var d = context.Set<Product>().Include(c=>c.SysInvoice).ToList();
//可以使用字符串传入属性的名称,但是这样会很容易出错,使用lambda能更好的避免错误
var product = context.Set<Product>().Include("SysInvoice").FirstOrDefault();

预加载也支持同时加载二级属性,如果给发票添加一个开票人信息

            //预加载也支持同时加载二级属性,比如我们给Invoice增加一个开票人属性,这是一个Employee对象
var product2 = context.Set<Product>().Include(p => p.SysInvoice.Drawer).FirstOrDefault();
var product3 = context.Set<Product>().Include("SysInvoice.Drawer").FirstOrDefault();

显式加载:

使用Entry方法,对于集合使用Collection,单个实体则使用Reference。

            //手动加载sysinvoice
context.entry(productget2).reference(p => p.sysinvoice).load();
var date2 = productget2.sysinvoice.createdate; //手动加载集合属性也类似,就是把reference方法换成collection方法
//此时不会加载photos属性关联的对象
var productget = context.set<product>().first(r => r.id == );
//手动加载photos集合
context.entry(productget).collection(p => p.photos).load();
var count = productget.photos.count;

Entity Framework关联查询以及数据加载(延迟加载,预加载)的更多相关文章

  1. django模型层优化(关联对象) 懒加载和预加载 +长链接

    懒加载 存在于外键和多对多关系不检索关联对象的数据调用关联对象会再次查询数据库 问题根源 查看django orm的数据加载,两次. 查询user,查询menu 预加载的方法 预加载单个关联对象--s ...

  2. 整理一下Entity Framework的查询

    整理一下Entity Framework的查询 2012-08-30 13:41:59 标签:Entity Framework 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信 ...

  3. 在Entity Framework 7中进行数据迁移

    (此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注.) 题记:虽然EF7重新设计了Entity Framework,不过也还是能够支持数据迁移的. Entity Fra ...

  4. 用Entity Framework往数据库插数据时,出现异常,怎么查看异常的详细信息呢?

    做项目时,在用Entity Framework往数据库插数据时,程序报异常,但是通过报的异常死活没法查看异常的详细信息.这让人很是烦恼.本着自己动手丰衣足食的原则,通过查看资料终于找到了显示异常详细信 ...

  5. Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...

  6. javascript图片懒加载与预加载的分析

    javascript图片懒加载与预加载的分析 懒加载与预加载的基本概念.  懒加载也叫延迟加载:前一篇文章有介绍:JS图片延迟加载 延迟加载图片或符合某些条件时才加载某些图片. 预加载:提前加载图片, ...

  7. 基于jQuery的图片异步加载和预加载实例

    如今的网页中有很多图片,比如相册列表,那么如果一次性读取图片将会瞬间加重服务器的负担,所以我们用jQuery来实现图片的异步加载和预加载功能,这样在页面的可视范围内才会加载图片,当拖动页面至可视界面时 ...

  8. 带你认识网站图片img懒加载和预加载的区别

    懒加载 什么是懒加载? 懒加载也就是延迟加载.当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次,俗称占位图),只有当图片出现在浏览 ...

  9. Entity Framework关联实体的三种加载方法

    推荐文章 EF性能之关联加载 总结很好 一:介绍三种加载方式 Entity Framework作为一个优秀的ORM框架,它使得操作数据库就像操作内存中的数据一样,但是这种抽象是有性能代价的,故鱼和熊掌 ...

随机推荐

  1. WireShark网络性能分析

    最近生产上出现一个性能问题,表现为:行情延时5s左右.从log一路追查下去,发现是我们自己写的一个行情网关(部署在xx.xx.xx.132)<->第三方的中转网关(部署在xx.xx.xx. ...

  2. python学习03——设计,与input有关

    笨办法学python第36节,我写的代码如下: from sys import exit def rule(): print "Congratulations! You made the r ...

  3. Bootstrap学习笔记(一)

    一.什么是Bootstrap bootstrap是一款css框架,便于响应式设计. 二.怎样使用bootstarp 最常用的方法,在html结构中引入样式表bootstarp.min.css,以及jq ...

  4. Github——入门笔记

    一般操作步骤 developer:(你在别人基础上开发) init->clone->add->commit->remote add(origin的地址)->push or ...

  5. c/c++程序员必须要掌握开源项目

    作为一个经验丰富的C/C++程序员, 肯定亲手写过各种功能的代码, 比如封装过数据库访问的类, 封装过网络通信的类,封装过日志操作的类, 封装过文件访问的类, 封装过UI界面库等, 也在实际的项目中应 ...

  6. 【转】Linux Top 命令解析 比较详细

    TOP命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况.   TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户 ...

  7. AngularJs的UI组件ui-Bootstrap分享(十二)——Rating

    Rating是一个用于打分或排名的控件.看一个最简单的例子: <!DOCTYPE html> <html ng-app="ui.bootstrap.demo" x ...

  8. 例子:Execution Model Sample - 应用状态保存

    WP中,当你的应用被切换到后台 后,就进入了休眠状态,然后当一个应用从墓碑恢复时,如何恢复相应的状态,该例子就演示了如何保存和恢复UI以及APP相关状态. 这里有一篇很好的文章,请参见: http:/ ...

  9. oracle使用sqlplus创建表空间

    一.打开命令行窗口,输入以下命令:sqlplus /nolog 回车后,将出现提示符 SQL>, 这时输入conn / as sysdba 一般即可登录,如果失败的话,可以试一下用conn sy ...

  10. Maven联网问题

    关于Maven联网问题 关于如何找到Maven默认的本地仓库问题 修改Maven默认本地仓库 找到 <localRepository>/path/to/local/repo</loc ...