Entity Framework中的几种加载方式
在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中的几种加载方式的更多相关文章
- Android Activity四种加载方式
Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...
- Linux共享库两种加载方式简述
Linux共享库两种加载方式简述 动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是 ...
- Xamarin Android Fragment的两种加载方式
android Fragment的重点: 3.0版本后引入,即minSdk要大于11 Fragment需要嵌套在Activity中使用,当然也可以嵌套到另外一个Fragment中,但这个被嵌套的Fra ...
- hive--udf函数(开发-4种加载方式)
UDF函数开发 标准函数(UDF):以一行数据中的一列或者多列数据作为参数然后返回解雇欧式一个值的函数,同样也可以返回一个复杂的对象,例如array,map,struct. 聚合函数(UDAF):接受 ...
- Android学习笔记_50_(转 四种加载方式详解(standard singleTop singleTask singleInstance)
Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...
- Android 四种加载方式详解(standard singleTop singleTask singleInstance) .
Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...
- 二、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Modules的几种加载方式
这一篇梳理Prism中07示例Module的几种加载方式. 07示例分为了5个,有5种不同的Module加载方式. 我们开始学习加载Modules 观察07-Modules-Appconfig示例 分 ...
- ios 图片的两种加载方式
控件加载图片,plist,懒加载,序列帧动画,添加动画效果. IOS中有2种加载图片的方式. 方式一:有缓存(图片所占用的内存会一直停留在程序中) + (UIImage *)imageNamed:(N ...
- Java中的资源文件加载方式
文件加载方式有两种: 使用文件系统自带的路径机制,一个应用程序只能有一个当前目录,但可以有Path变量来访问多个目录 使用ClassPath路径机制,类路径跟Path全局变量一样也是有多个值 在Jav ...
随机推荐
- [Noip2007]Core树网的核
嘟嘟嘟 首先求树的直径两次bfs即可,实际上bfs就是最短路,因为树上路径是唯一的,所以用任何一种遍历方法都行(spfa和dijkstra当然也可以). 可以证明,只要求出任意一条直径就行了,为什么呢 ...
- 7、Spring -Cloud-路由网管Spring Cloud Zuul
7.1.为什么需要Zuul Zuul 作为路由网关组件,在微服务架构中有着非常重要的作用: 7.2.Zuul的工作原理 Zuul 是通过 Servlet 来实现的, Zuul 通过自定义的 Zuu!S ...
- No.3 - CSS transition 和 CSS transform 配合制作动画
课程概述 作业提交截止时间:09-01 任务目的 深度理解掌握 transition-timing-function 以及它的意义 学会配合使用 CSS transform 和CSS transiti ...
- js 键盘点击事件
回车键(Enter)的触发事件 js 代码如下: document.onkeydown = function (e) { if (!e) e = window.event; if ((e.keyCo ...
- notepad++怎样添加文件目录
需要安装一个Explorer.dll文件 方法一:这个方法我个人试了不成功,可能因为版本问题,进入后选择Explorer进行安装 方法二:网上下载 Explorer.dll文件,放到\\No ...
- 在Java中使用Maven配置的版本信息
我们在使用maven开发一些项目的时候需要知道当前的版本状态,但版本状态储存在pom.xml文件中,可以采用以下2种方式进行获取: 1. 采用xml解析的方式去获取pom文件的{project.ver ...
- PAT——1021. 个位数统计
给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + d0 (0<=di<=9, i=0,...,k-1, dk-1>0),请编写程序统计每种不同的个位数字 ...
- Linux 内核版本号查看
简要:1,lsb_release -a 查看linux系统版本 2,uname -a 查看内核版本
- Datatable报错Uncaught TypeError: Cannot read property 'cell' of undefined
使用Datatables时,报出错误 仔细想想,是因为我在columns里加入了id,并设置visible:false 但是却没在下面的HTML部分多加一个 th 虽然我觉得因为id是隐藏的,不用加上 ...
- OpenID Connect Core 1.0(八)从第三方发起登录
在某些情况下,登录流程由一个OpenID提供者或其他方发起,而不是依赖方(RP).在这种情况下,发起者重定向到RP在发起登录终结点,RP的请求验证请求发送到指定的OP.这个发起登录终结点可以在RP深度 ...