Entity Framework关联查询以及数据加载(延迟加载,预加载)
数据加载分为延迟加载和预加载
EF的关联实体加载有三种方式:Lazy Loading,Eager Loading,Explicit Loading,其中Lazy Loading和Explicit 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;
作为默认配置的延迟加载,需要满足以下几个条件:
context.Configuration.ProxyCreationEnabled = true;
context.Configuration.LazyLoadingEnabled = true;
导航属性被标记为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关联查询以及数据加载(延迟加载,预加载)的更多相关文章
- django模型层优化(关联对象) 懒加载和预加载 +长链接
懒加载 存在于外键和多对多关系不检索关联对象的数据调用关联对象会再次查询数据库 问题根源 查看django orm的数据加载,两次. 查询user,查询menu 预加载的方法 预加载单个关联对象--s ...
- 整理一下Entity Framework的查询
整理一下Entity Framework的查询 2012-08-30 13:41:59 标签:Entity Framework 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信 ...
- 在Entity Framework 7中进行数据迁移
(此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注.) 题记:虽然EF7重新设计了Entity Framework,不过也还是能够支持数据迁移的. Entity Fra ...
- 用Entity Framework往数据库插数据时,出现异常,怎么查看异常的详细信息呢?
做项目时,在用Entity Framework往数据库插数据时,程序报异常,但是通过报的异常死活没法查看异常的详细信息.这让人很是烦恼.本着自己动手丰衣足食的原则,通过查看资料终于找到了显示异常详细信 ...
- Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案
转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...
- javascript图片懒加载与预加载的分析
javascript图片懒加载与预加载的分析 懒加载与预加载的基本概念. 懒加载也叫延迟加载:前一篇文章有介绍:JS图片延迟加载 延迟加载图片或符合某些条件时才加载某些图片. 预加载:提前加载图片, ...
- 基于jQuery的图片异步加载和预加载实例
如今的网页中有很多图片,比如相册列表,那么如果一次性读取图片将会瞬间加重服务器的负担,所以我们用jQuery来实现图片的异步加载和预加载功能,这样在页面的可视范围内才会加载图片,当拖动页面至可视界面时 ...
- 带你认识网站图片img懒加载和预加载的区别
懒加载 什么是懒加载? 懒加载也就是延迟加载.当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次,俗称占位图),只有当图片出现在浏览 ...
- Entity Framework关联实体的三种加载方法
推荐文章 EF性能之关联加载 总结很好 一:介绍三种加载方式 Entity Framework作为一个优秀的ORM框架,它使得操作数据库就像操作内存中的数据一样,但是这种抽象是有性能代价的,故鱼和熊掌 ...
随机推荐
- Xcode模拟器怎么模拟定位?
new file --->添加一个.gpx文件 打开你的gpx文件,然后修改你想要模拟的经纬度: 运行时选上你刚才的位置
- Ubuntu安装node
#!/bin/bash echo "添加环境变量需要root权限,如无root权限,则不添加环境变量" echo "输入Node下载地址(目前仅支持Node官方网站上Li ...
- Bootstrap<基础二十> 标签
Bootstrap 标签.标签可用于计数.提示或页面上其他的标记显示.使用 class .label 来显示标签,如下面的实例所示: <!DOCTYPE html> <html> ...
- Android中的多线程编程
问题 Android的UI也是线程不安全的,如果要更新应用程序里的UI元素,必须在主线程中进行,否则就会抛异常.比如用一个Button的onClick函数去更新界面上的元素,就会得到一个CalledF ...
- Android中日期函数Calendar的一些用法和注意事项
1.月份获取时加1 Canlendar.MONTH + 1 因为使用的是罗马历,Calendar.MONTH返回的数值不是一年中月份的值,而是当前月份距离第一个月份的差值 如:当前月份为9月份,距离1 ...
- Bash shell的内建命令:type
type指令是用来观察指令时来自于外部指令还是内建在bash中的指令. type [-tpa] name 选项与参数: :不加任何选项与参数时,type会显示出name是外部指令还是bash内建指 ...
- css3中transition和animation的回调处理
弱鸡最近在准备面试,网上找了一些题,发现一些基础题也完全答不好(┬_┬)看来还是要再接再励啊w(゚Д゚)w 言归正传,今天的主题是CSS3中的动画回调处理,这里动画执行完毕后触发的事件是transit ...
- Entity Framework Linq 动态组合where条件
public static class PredicateExtensions { public static Expression<Func<T, bool>> True&l ...
- sql语句格式化数字(前面补0)、替换字符串
以下是详细分析: 1.select power(10,3)得到1000(即:10的3次方) 2.select cast(1000+33 as varchar) 将1000转换类型(即:将int转化成v ...
- Freemarker工具类
Freemarker文件模板工具类 提供了解析生成文件.解析生成字符串的两个方法! package org.lunatic.util; import java.io.File; import java ...