推荐文章

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 = false
OrgPlate plate = db.OrgPlates.FirstOrDefault();
}

2-2:Eager Loading模式

作用:

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

使用方法:

//同Lazy Loading刚好相反  dConfiguration.LazyLoadingEnabled = false
private static void EagerLoading(EFLoadingContext ctx)
{
//发送一条查询到数据库库,查询所有的province并关联city和governor
var 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)
{
//发送一条查询到数据库,查询所有的province
var list = ctx.Provines.ToList();
foreach (var province in list)
{
var p = ctx.Entry(province);
//发送一条查询,查询所有当前province的city
p.Collection(t => t.Cities).Load();
//发送一条查询,查询当前province的governor
p.Reference(t => t.Governor).Load();
//不管ctx.Configuration.LazyLoadingEnabled为false,还是没有标注导航属性virtual,都不会抛出异常
Print(province);
}
}
//例子引用自http://www.cnblogs.com/nianming/p/3494781.html

Entity Framework关联实体的三种加载方法的更多相关文章

  1. EF三种加载方法

    EF性能之关联加载   鱼和熊掌不能兼得 ——中国谚语 一.介绍 Entity Framework作为一个优秀的ORM框架,它使得操作数据库就像操作内存中的数据一样,但是这种抽象是有性能代价的,故鱼和 ...

  2. C# Entity Framework 更新数据的三种方法

    例: 实体类: public class TestDbContext : DbContext { public DbSet<Test> Tests { get; set; } public ...

  3. Entity Framework入门教程(8)---预先加载、延迟加载、显示加载

    1.预先加载 预先加载:在对一种类型的实体进行查询时,将相关的实体作为查询的一部分一起加载.预先加载可以使用Include()方法实现. 1.加载一个相关实体类型 栗子:使用Include()方法从数 ...

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

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

  5. UIWebView的三种加载方式

    一.使用UIWebView 将web content 嵌入到应用上. API提供了三种方法: - (void)loadRequest:(NSURLRequest *)request; - (void) ...

  6. sea.js及三种加载方式的异同

      一.前言     浏览器本身并不提供模块管理的机制,过去网页开发中,为了使用各种模块,不得不在加入一大堆script标签.这样就使得网页体积臃肿,难以维护,还产生大量的HTTP请求,拖慢显示速度, ...

  7. Entity Framework Code First -- 延迟加载和预先加载

    还是以这两个表为例子 country包含零个或多个city, 这个外键关系是我后来加上去,原来没有. 然后再用Power Tool逆向, 产生如下代码 1: using System.Componen ...

  8. 图解script的三种加载方式 异步加载顺序

    摘录如下: 可以很清晰的看出: <script>: 脚本的获取和执行是同步的.此过程中页面被阻塞,停止解析. <script defer = "defer"> ...

  9. Entity Framework 数据库初始化的三种方法

    在数据库初始化产生时进行控制,有三个方法可以控制数据库初始化时的行为.分别为CreateDatabaseIfNotExists.DropCreateDatabaseIfModelChanges.Dro ...

随机推荐

  1. asp.net下载的方法1

    1. 首先新建一个用于进行下载处理的page页,如download.aspx,里面什么东西也没有. 2. 添加一个DownloadHandler类,它继承于IHttpHandler接口,可以用来自定义 ...

  2. iOS9.0之后不支持http请求解决方案

    打开info.plist文件,添加关键字 NSAppTransportSecurity 类型 Dictionary 在 NSAppTransportSecurity 下添加关键字 NSAllowsAr ...

  3. 练习题之ThreadLocal

    public class ThreadLocalMain { private static ThreadLocal<Integer> value = new ThreadLocal< ...

  4. JS调用ashx文件传递中文参数取不到值的解决方案

    引自:http://www.cnblogs.com/yinpeng186/archive/2011/09/30/2196726.html

  5. 18、HTML

    HTML 超文本标记语言(Hyper Text Markup Language). 用来描述网页的一种语言. HTML标签 由尖括号包围的关键词. 如:<html> 通常是成对出现的,开始 ...

  6. JQ动画事件

    1.会飞的li html: <ul id="ulL"> <li>中国</li> <li>美国</li> <li&g ...

  7. C#类和成员定义

    1 定义类     C#用关键字class来定义类.默认情况下,类声明为内部(internal)的,即只有当前项目中的代码才能访问它.与之相对应的,还可以用public关键字来修饰,这样该类还可以由其 ...

  8. iOS开发——基于corelocation位置定位——工具类

    (代码工具类已写好,空闲时间整理成文档,待更新……)

  9. 不同浏览器下css 透明度的写法

    filter:alpha(opacity=90); /* IE transparent */ -moz-opacity:0.9; /* Moz + FF transparent */ opacity: ...

  10. Stay Hungry, Stay Foolish--2005斯坦福大学05年毕业演讲

    转自http://www.cnblogs.com/daizhj/articles/1493813.html 斯蒂夫•保罗•乔布斯(Steve Paul Jobs,1955年2月24日出生-)是蘋果電腦 ...