推荐文章

EF性能之关联加载 总结很好

一:介绍三种加载方式

Entity Framework作为一个优秀的ORM框架,它使得操作数据库就像操作内存中的数据一样,但是这种抽象是有性能代价的,故鱼和熊掌不能兼得。但是,通过对EF的学习,可以避免不必要的性能损失。本篇只介绍关联实体的加载的相关知识,这在我之前的文章中都有介绍。我们已经了解到EF的关联实体加载有三种方式:Lazy Loading,Eager Loading,Explicit Loading,其中Lazy Loading和Explicit Loading都是延迟加载。(一)Lazy Loading使用的是动态代理,默认情况下,如果POCO类满足以下两个条件,EF就使用Lazy Loading:POCO类是Public且不为Sealed。
导航属性标记为Virtual。
关闭Lazy Loading,可以将LazyLoadingEnabled设为false,如果导航属性没有标记为virtual,Lazy Loading也是不起作用的。(二)Eager Loading使用Include方法关联预先加载的实体。(三)Explicit Loading使用Entry方法,对于集合使用Collection,单个实体则使用Reference。

2-1:Lazy Loading模式

作用

/*在读取父类的时候自动将所有关联类的实体都加载出来
**比如
*/public class Site{[Key]public int Id{ get; set; }public string Name { get; set; }/*virtual 知识点关键字:EF三种关联加载  Lazy Loading,Eager Loading,Explicit Loading*/public virtual ICollection<News> Newss { get; set; }}
/*通过db.Site.FirstOrDefault();会加载出一个符合条件的Site实体,并且Site实体下的所有News对象也都**加载出来并且保存在Newss中
*/

使用方法

两步第一:在需要延迟加载的属性前加上virtual ,该属性的类型可以是任务的集合类型ICOLLOCT<T>或者是0/1..1关联属性。如: public virtual List<Product> Products { get; set; }第二:在context构造器中开启延迟加载功能Configuration.LazyLoadingEnabled = true;    //EF6 之前的版本可能是ContextOptions.LazyLoadingEnabled = true;

涨姿势

//既支持在Content构造器中一次设置,程序全部通用
//也可以在程序执行查询等命令之前动态设置
//比如using (var db = new SpriderContent()){db.Configuration.LazyLoadingEnabled = falseOrgPlate plate = db.OrgPlates.FirstOrDefault();}

2-2:Eager Loading模式

作用:

EF不会再帮你把关联实体加载出来,而只会把当前表的内容读取出来,提高效率

使用方法:

//同Lazy Loading刚好相反  dConfiguration.LazyLoadingEnabled = false
private static void EagerLoading(EFLoadingContext ctx){//发送一条查询到数据库库,查询所有的province并关联city和governorvar list = ctx.Provines.Include(t => t.Cities).Include(t => t.Governor);foreach (var province in list){//不管ctx.Configuration.LazyLoadingEnabled为false,还是没有标注导航属性virtual,都不会抛出异常
                Print(province);}}//例子来源于http://www.cnblogs.com/nianming/p/3494781.html

2-3:Explicit Loading模式

使用方法

1:Configuration.LazyLoadingEnabled = false;
2:Explicit Loading使用Entry方法,对于集合使用Collection,单个实体则使用Reference。void ExplicitLoading(EFLoadingContext ctx){//发送一条查询到数据库,查询所有的provincevar list = ctx.Provines.ToList();foreach (var province in list){var p = ctx.Entry(province);//发送一条查询,查询所有当前province的cityp.Collection(t => t.Cities).Load();//发送一条查询,查询当前province的governorp.Reference(t => t.Governor).Load();//不管ctx.Configuration.LazyLoadingEnabled为false,还是没有标注导航属性virtual,都不会抛出异常
            Print(province);}}
//例子引用自http://www.cnblogs.com/nianming/p/3494781.html

转载于:https://www.cnblogs.com/farcall/p/4850458.html

Entity Framework关联实体的三种加载方法相关推荐

  1. ios首次加载web_IOS_IOS中UIWebView的使用详解,一、初始化与三种加载方式 UI - phpStudy...

    IOS中UIWebView的使用详解 一.初始化与三种加载方式 UIWebView继承与UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化,其加载数据的方式有三种 ...

  2. MyBatis 延迟加载的三种加载方式深入,你get了吗?

    延迟加载 延迟加载对主对象都是直接加载,只有对关联对象是延迟加载. 延迟加载可以减轻数据库的压力, 延迟加载不可是一条SQL查询多表信息,这样构不成延迟加载,会形成直接加载. 延迟加载分为三种类型: ...

  3. 【HTML】三种加载动画

    加载动画 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8 ...

  4. HBase协处理器三种加载方式

    一.协处理器简介 HBase协助处理器允许用户将部分逻辑在数据存放端即 HBase RegionServer 服务端进行计算,也即允许用户在 RegionServer 运行用户自定义的代码.这相当于是 ...

  5. VS-OpenCV三种加载图片的方式

    绝对路径和相对路径 #include<iostream> #include<opencv2/core.hpp>//核心接口 #include<opencv2/highgu ...

  6. Unity—AssetBundle的打包及四种加载资源方式

    AssetBundle打包:脚本放在Editor文件夹内 具体代码如下: using UnityEditor; using System.IO;public class CreateAssetBund ...

  7. postgresql源码学习(57)—— pg中的四种动态库加载方法

    一. 基础知识 1. 什么是库 库其实就是一些通用代码,可以在程序中重复使用,比如一些数学函数,可以不需要自己编写,直接调用相关函数即可实现,避免重复造轮子. 在linux中,支持两种类型的库: 1. ...

  8. hive--udf函数(开发-4种加载方式)

    UDF函数开发 标准函数(UDF):以一行数据中的一列或者多列数据作为参数然后返回解雇欧式一个值的函数,同样也可以返回一个复杂的对象,例如array,map,struct. 聚合函数(UDAF):接受 ...

  9. 区分Activity的四种加载模式

    在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity.可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity. ...

最新文章

  1. 实战 | 哪个瞬间让你突然觉得CV技术真有用?
  2. ubuntu mysql 驱动_怎么在Ubuntu下为MySQL添加ODBC驱动?
  3. 文巾解题 1556. 千位分隔数
  4. 统计一段英文中单词的个数c语言,C语言统计一篇英文短文中单词的个数实例代码...
  5. 老师:你根本不知道我有多想逃课
  6. delphi中的函数传参如何传枚举参数_我是这样使用SpringBoot(API传参)
  7. Oracle 怎么删除重复数据
  8. linux系统不关机添加硬盘吗,Linux服务器不关机新增硬盘的方法
  9. CDOJ 1805 矩阵 数学
  10. Linux修改时区(tzselect) 【例子:修改时区 为 中国 东8区 的时间】
  11. WIN7下怎么安装iis教程
  12. Java并发编程:03-多线程并发下载器, 支持断点下载(手写不限速的迷你版迅雷)
  13. 算法设计与分析——背包问题(Java)
  14. Ubuntu下的onnxruntime(c++)编译
  15. Unity3D 2021版本使用MonoDevelop代码编辑器
  16. Matlab 两条曲线间填充颜色,改变透明度
  17. halcon例程学习笔记(10)---图像灰度共生矩阵cooc_feature_image.hdev
  18. Java 某天的开始时间与结束时间
  19. 刚入行java程序员VS 3年以上java程序员,太形象了,哈哈哈~·~
  20. 大天使之剑h5服务器临时维护,《大天使之剑H5》2月28日维护更新公告

热门文章

  1. pyqt5示例_木辛老师的编程课堂:Python和Qt第一讲之初识PyQt5
  2. 【flink】Flink源码编译:Flink1.11+版本编译及部署
  3. 【kafka】Number of alive brokers 0 does not meet the required replication factor 3
  4. 【kafka】kafka Replica无法从leader同步消息
  5. 【Flink】Class class org.apache.flink.types.Row cannot be used as a POJO type because not all fields a
  6. 【MySQL】MySQL EXPLAIN用法和结果
  7. 【Flink】Flink Group by 操作 报错 Expression xxx is not being grouped
  8. Spring:@Transactional 注解使用讲解
  9. jps出现– process information unavailable解决方法
  10. MyBatis插入数据返回插入对象的主键