在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. linux 下 chkconfig安装与使用详解

    chkconfig 安装 开始的时候因为Raspbian的原因,系统是不自带chkconfig这个命令的, root@raspberrypi:~# chkconfig-bash: chkconfig: ...

  2. Java 读取properties

    package Db; import java.io.InputStream; import java.util.Properties; import java.io.BufferedReader; ...

  3. linux 下线程错误查找,与线程分析命令

    一. 使用top和jstack查找线程错误 我们使用jdk自带的jstack来分析.当linux出现cpu被java程序消耗过高时,以下过程说不定可以帮上你的忙: 1.top查找出哪个进程消耗的cpu ...

  4. nRF5 SDK for Mesh( 七 ) BLE MESH 的 架构(rchitecture)

    The mesh architecture   The mesh stack consists of a number of subsystems that are interfaced throug ...

  5. JBPM学习(四):运行流程实例

    概念: ProcessInstance,流程实例:代表流程定义的一次执行.如:张三昨天按请假流程请了一次假.一个流程实例包含了全部执行阶段,当中最典型的属性就是跟踪当前节点的指针,例如以下图. Exe ...

  6. a^b%c 小技巧

    我们知道像a^b这种数在计算的时候由于大的增长速度非常快,所以常常越界,所以非常多题目在出的时候都会让我们取模. a^b = a*a*a*a--(一共b个a相乘):我们前一篇文章在说两个数相乘的时 , ...

  7. 寻找最小的k个数(四种方法)

    1 使用从大到小的优先队列保存最小的K个数,每次取出K个数之后的其余数和堆顶元素比较,如果比堆顶元素小,则将堆顶元素删除,将该元素插入 void topK(int arr[],int n,int k) ...

  8. PHP介绍(PHP入门1)

    BS架构和CS架构 B:Browser:浏览器 S:Server:服务器 C:Client:客户端 BS 浏览器和服务器的关系,通过浏览器来访问服务器,比如:百度.新浪... 优点:只要有浏览器就能访 ...

  9. java 进销存 库存管理 销售报表 商户管理 springmvc SSM crm 项目

    系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3  SSM ...

  10. C# WebClient Get获取网页内容

    //不知道怎么删除,只好留着 1. Get方式: WebClient web = new WebClient(); var html = web.DownloadString(url); 2. Pos ...