在Entity Framework中有三种加载的方式,分别是延迟加载,自动加载和显示加载。下面用一个例子来说明:现在有两个表,一个是资料表(Reference),另外一个表是资料分类表(Catalog)。一个资料属于某一个分类,但是一个分类下可以包含多个资料。是一个一对多的关系。

       两个实体类代码如下:

public partial class Catalog

{

    public Catalog()

    {

        this.References = new List<Reference>();

    }

 

    public string CatalogID { get; set; }

    public string CatalogName { get; set; }

    public ICollection<Reference> References { get; set; }

}

public partial class Reference

{

    public string ReferenceID { get; set; }

    public string CatalogID { get; set; }

    public string ReferenceName { get; set; }

    public virtual Catalog Catalog { get; set; }

}

        1、延迟加载。(如果要使用延迟加载,一是Context中的 this.Configuration.LazyLoadingEnabled =true;另外是要求导航属性前面有virtual关键字,任何条件缺一不可);

List<Reference> refeList = new List<Reference>();//此时只加载了Reference

 

refeList = dbContext.Set<Reference>().ToList();

 

Catalog c = refeList[0].Catalog;//此时会自动生成一条Sql语句,查询这个Referece里面的Catalog,即实现了延迟加载

        2、手动加载,手动加载是在我需要的时候,通过调用Include方法来实现加载的。手动加载不需要任何条件。

return dbContext.Set<Reference>().Include("Catalog").ToList();

 

//可以直接传入字段的名称,也可以通过lamaba来传递,但是使用后一种方法的时候,需要添加using System.Data.Entity;引用

//return dbContext.Set<Reference>().Include(t => t.Catalog).ToList();

       手动加载时,是一次性的加载,只生成一条Sql语句,这条Sql语句是同时查询Reference以及Reference中对应的Catalog 。如果是一对多的关系,有的时候,根本不需要延迟加载,所以一般都把延迟加载关闭掉,在需要使用的时候,通过Include来手动的加载;Include一般适用于一对多的关系时,当读取多的时候,可以手动把一的那个实体加载上。比如读取一个资料时,把这个资料对应的分类实体也读取出来。但是反过来,一般就不用,一般很少会在读取分类时,就把这个分类下的所有资料读取出来,除非是查询的时候。

        3、显式的加载,当我们想在使用的时候,显式的调用去加载,那么我们可以使用Entry中的Collection(List)或者Reference(单个实体)去加载;当我们在读取一个分类的时候,我们可以显示的去加载,每个分类里面的资料。如:

using (DbContext dbContext = new TestDatabaseContext())

{

    entityList = dbContext.Set<Catalog>().OrderBy(t=>t.CatalogID).Skip(1).Take(3).ToList();

 

    foreach (Catalog c in entityList)

    {

        dbContext.Entry(c).Collection(t => t.References).Load();//显式加载

    }

 

    return entityList;

}

 

参考资料:

http://www.cnblogs.com/nianming/p/3494781.html#2861128

http://www.cnblogs.com/nianming/archive/2013/01/09/2846952.html

Entity Framework中的几种加载方式的更多相关文章

  1. Android Activity四种加载方式

    Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...

  2. Linux共享库两种加载方式简述

      Linux共享库两种加载方式简述  动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是 ...

  3. Xamarin Android Fragment的两种加载方式

    android Fragment的重点: 3.0版本后引入,即minSdk要大于11 Fragment需要嵌套在Activity中使用,当然也可以嵌套到另外一个Fragment中,但这个被嵌套的Fra ...

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

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

  5. Android学习笔记_50_(转 四种加载方式详解(standard singleTop singleTask singleInstance)

    Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...

  6. Android 四种加载方式详解(standard singleTop singleTask singleInstance) .

    Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...

  7. 二、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Modules的几种加载方式

    这一篇梳理Prism中07示例Module的几种加载方式. 07示例分为了5个,有5种不同的Module加载方式. 我们开始学习加载Modules 观察07-Modules-Appconfig示例 分 ...

  8. ios 图片的两种加载方式

    控件加载图片,plist,懒加载,序列帧动画,添加动画效果. IOS中有2种加载图片的方式. 方式一:有缓存(图片所占用的内存会一直停留在程序中) + (UIImage *)imageNamed:(N ...

  9. Java中的资源文件加载方式

    文件加载方式有两种: 使用文件系统自带的路径机制,一个应用程序只能有一个当前目录,但可以有Path变量来访问多个目录 使用ClassPath路径机制,类路径跟Path全局变量一样也是有多个值 在Jav ...

随机推荐

  1. UVA529 Addition Chains

    嘟嘟嘟 还是\(IDA*\). 这道题是\(ZOJ\)的加强版,\(n\)从\(100\)扩大到了\(10000\),所以必须有非常给力的剪枝才能过. 除了迭代加深,还要加上估价函数:对于当前数\(x ...

  2. 移动端h5列表页上拉加载更多

    背景 上星期公司要求做一个回收书籍的h5给安卓用,里面有一个功能是回收记录列表.设计师那边出的稿子是没有要求分页或者是上拉刷新的,但是众所周知,列表页数据很多的情况下,h5加载是很慢的.所以我一开始是 ...

  3. 跳转到系统设置界面 iOS

    NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; if ([[UIApplication sharedApp ...

  4. iOS 关闭图片渲染

    在为Button 设置背景图片的时候, 会发现显示的效果和UI给的图片不一样, 往往是把图片显示成为蓝色, 这是因为在新版的iOS中, 会自动对图片渲染. 我们只要把图片渲染关掉就OK了 - (UII ...

  5. Maven创建Web项目、、、整合SSM框架

    自己接触ssm框架有一段时间了,从最早的接触新版ITOO项目的(SSM/H+Dobbu zk),再到自己近期来学习到的<淘淘商城>一个ssm框架的电商项目.用过,但是还真的没有自己搭建过, ...

  6. centos6.4 安装code::blocks

    今天下午闲着没事尝试在自己的PC中的CentOS上装一个Code::Blocks,因为是Linux菜鸟折腾了一下午才基本算搞定但依然有疑惑: 在网上各种谷哥度娘最后才发现还是官方的文档最靠谱:看这里. ...

  7. JNDI数据源(在Tomcat下配置JNDI多数据源实例)

    一,添加数据库驱动包加入classpath. 这里我用到了oracle和mysql.所以由两个jar包:ojdbc14.jar和mysql-connector-java-5.1.13-bin.jar. ...

  8. LNMP web服务的安装

    第1章 安装Nginx 环境: 系统:CentOS6.5 软件:nginx-1.6.3     mysql-5.5.49    php-5.5.32 1.1 Nginx官网 http://nginx. ...

  9. Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first.

    最近在开发一个网站时,有个需要是 如果有新预警信息要在网页中播放提示音.页面打开会请求是否有新信息,有则播放提示音.在Chrome的最新浏览器中,播放会报错,控制台显示Uncaught (in pro ...

  10. mysql 基本的操作数据库命令

    注意:命令操作都是分号结尾 1 .连接mysql: mysql -u  用户名   -p 密码 2.展示所有数据库: show  databases; 3.进入数据库: use   数据库名字; 4. ...