推荐文章

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. jQuery 定时局部刷新(setInterval)方法总结

    来自:http://www.jbxue.com/article/8516.html 1.jQuery 定时局部刷新(setInterval),显示时间的代码. <head> <scr ...

  2. <input> 标签

    HTML5 中的新属性.   属性 值 描述 accept mime_type 规定通过文件上传来提交的文件的类型. align left right top middle bottom 不赞成使用. ...

  3. Java反序列化

    一.序列化和反序列化的概念       把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬 ...

  4. JAVA Oauth 认证服务器的搭建

    http://blog.csdn.net/binyao02123202/article/details/12204411 1.软件下载 Oauth服务端: http://code.google.com ...

  5. Asp.Net静态资源动态压缩之WebOptimization

    一.Asp.Net中对Css/Js的动态压缩工具 WebOptimization 在Asp.NetMVC自带的模板项目中自动引入了当前WebOptimization工具.如果使用的空模板Nuget命令 ...

  6. Android手机出现"已安装了存在签名冲突的同名数据包"的原因及解决办法

    http://blog.csdn.net/dyllove98/article/details/8830264 如果你不是开发者:如果你在android上更新一个已经安装过较早版本软件时,安装到最后一步 ...

  7. Android 讯飞语音之语音合成(在线有声朗读)

    原文:http://www.cnblogs.com/scetopcsa/p/3845427.html 在线语音合成的使用方法: 首先下载相关的sdk,这个网址里有多种版本,我选择的Android. h ...

  8. 使用sqlldr命令导入资料到Oracle数据库表中的示例说明

    CSV: Comma-Separated Values(逗号分隔值)的缩写,是以逗号分隔字段的多行文本文件   sqlldr 是sql*loader的缩写,此工具在安装完整版的Oracle客户端后就有 ...

  9. Ext.Net学习笔记13:Ext.Net GridPanel Sorter用法

    Ext.Net学习笔记13:Ext.Net GridPanel Sorter用法 这篇笔记将介绍如何使用Ext.Net GridPanel 中使用Sorter. 默认情况下,Ext.Net GridP ...

  10. (LightOJ 1004) Monkey Banana Problem 简单dp

    You are in the world of mathematics to solve the great "Monkey Banana Problem". It states ...