Entity Framework入门教程(8)---预先加载、延迟加载、显示加载
1.预先加载
预先加载:在对一种类型的实体进行查询时,将相关的实体作为查询的一部分一起加载。预先加载可以使用Include()方法实现。
1.加载一个相关实体类型
栗子:使用Include()方法从数据库中获取所有学生及成绩级别。
导航属性实现预先加载:
using (var ctx = new SchoolDBEntities())
{
var stud1 = ctx.Students
.Include("Standard")
.Where(s => s.StudentName == "Bill")
.FirstOrDefault<Student>();
}
lambda表达式实现预先加载:
using (var ctx = new SchoolDBEntities())
{
var stud1 = ctx.Students.Include(s => s.Standard)
.Where(s => s.StudentName == "Bill")
.FirstOrDefault<Student>();
}
2.加载多个相关实体类型
栗子:使用Include()方法从数据库中获取所有学生及其成绩级别和评分老师。
导航属性实现预先加载:
using (var ctx = new SchoolDBEntities())
{
var stud1 = ctx.Students.Include("Standard.Teachers")
.Where(s => s.StudentName == "Bill")
.FirstOrDefault<Student>();
}
lambda表达式实现预先加载:
using (var ctx = new SchoolDBEntities())
{
var stud1 = ctx.Students.Include(s => s.Standard.Teachers)
.Where(s => s.StudentName == "Bill")
.FirstOrDefault<Student>();
}
2.延迟加载
1.概念
延迟加载顾名思义就是不立即加载,而是在我们访问的时候才加载,这和预先加载刚好相反。
一个栗子:查询Student的StudentAddress
using (var ctx = new SchoolDBEntities())
{
//这里只加载student实体,导航属性StudentAddress没有加载
IList<Student> studList = ctx.Students.ToList<Student>();
Student std = studList[]; //只加载特定student的住址(通过一个单独的sql进行实现的)
StudentAddress add = std.StudentAddress;
}
2.禁用延迟加载
我们可以禁用特定实体或者特定context的延迟加载。去掉实体导航属性的virtual,实体就不能进行延迟加载了。也可以通过context的cofiguration实现禁用该context下所有实体的延迟加载,代码如下:
public partial class SchoolDBEntities : DbContext
{
public SchoolDBEntities(): base("name=SchoolDBEntities")
{
//SchoolDBEntities的所有实体都禁用延迟加载
this.Configuration.LazyLoadingEnabled = false;
}
//如果去掉virtual那么Students禁用延迟加载
public virtual DbSet<Student> Students { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder){}
}
3.延迟加载前提
如果要实现延迟加载,必须满足下边三个条件,缺一不可
.context.Configuration.ProxyCreationEnabled应为true。
.context.Configuration.LazyLoadingEnabled应为true。
.导航属性应定义为public virtual xxx,如果属性未定义为virtual,则Context不会进行延迟加载。
3.显式加载
1.Load方法
即使禁用了延迟加载(在EF 6中),仍然可能延迟加载相关实体,这时可以使用Load()方法显式加载相关实体。
一个栗子:
using (var context = new SchoolContext())
{
var student = context.Students
.Where(s => s.FirstName == "Bill")
.FirstOrDefault<Student>(); context.Entry(student).Reference(s => s.StudentAddress).Load(); // loads StudentAddress
context.Entry(student).Collection(s => s.StudentCourses).Load(); // loads Courses collection
}
在上面的栗子中, context.Entry(student).Reference(s => s.StudentAddress).Load() 会加载StudentAddress实体。Reference()方法用于获取指定实体导航属性的对象,Load()方法显式加载。
同样的方式, context.Entry(student).Collection(s => s.Courses).Load() Collection()加载student的集合导航属性Courses,Load()方法显示加载。
2.Query方法
有时候我们想对查询的结果在加载前进行过滤,Query()方法就可以排上用场了。
一个栗子:查询名字为bill的学生的课程集合中数学课。
using (var context = new SchoolContext())
{
var student = context.Students
.Where(s => s.FirstName == "Bill")
.FirstOrDefault<Student>(); context.Entry(student)
.Collection(s => s.StudentCourses)
.Query()//这里不加载,下面对这一步的结果过滤
.Where(sc => sc.CourseName == "Maths")
.FirstOrDefault();
}
在上边栗子中 .Collection(s => s.StudentCourses).Query() 不加载结果集,我们可以把Query()方法的结果看作是一个中间结果,可以对中间结果做进一步过滤。
EF系列目录链接:Entity Franmework系列教程汇总
Entity Framework入门教程(8)---预先加载、延迟加载、显示加载的更多相关文章
- Entity Framework入门教程(13)---EF中的高并发
EF中的高并发 这里只介绍EF6中database-first开发方案的高并发解决方案,code-first开发方案中的高并发会在以后的EF CodeFirst系列中介绍. EF默认支持乐观并发:我们 ...
- Entity Framework入门教程(15)---DbContext追踪实体状态改变
这一节介绍DbContext追踪实体的变化.EF支持DbContext在其生命周期中自动追踪加载的实体.我们可以通过DbChangeTracker类获取DbContext追踪的所有实体的变化. 注意每 ...
- Entity Framework入门教程(1)---Entity Framework简介
什么是Entity Framework 学习EF的前提:熟练使用Linq和Ado.net,因为在使用EF框架进行开发时,我们大多数情况使用Linq进行查询和操作,而EF的底层实现用的是Ado.net. ...
- Entity Framework入门教程(14)---DbFirst下的存储过程
EF6中DbFirst模式下使用存储过程 我们已经知道EF可以将L2E或Entity SQL的查询语句自动转换成SQL命令,也可以根据实体的状态自动生成Insert/update/delete的Sql ...
- ASP .NET MVC 之Entity Framework入门教程及源码
本文主要的目的是 1. 说明Entity Framework Power Tools如何使用. 2. Entity Framework 快速门 实验环境: OS: Windows Server 20 ...
- Entity Framework入门教程:SQLite数据源访问
[环境安装] 可以通过NuGet直接搜索安装SQLite需要用到的组件 或者直接使用程序包管理器控制台 > Install-Package System.Data.SQLite 通过ADO.NE ...
- Entity Framework入门教程: Entity Framework支持的查询方式
Entity Framework支持的查询方式有三种 LINQ to Entities Entity SQL Native SQL [LINQ to Entities] LINQ(语言集成查询)是从V ...
- Entity Framework入门教程:创建实体数据模型
下图为一个已经创建好的数据库表关系 实体数据模型的创建过程 在Visual Studio项目中,右键程序集菜单,选择[添加]->[新建项],在[添加新项窗口]中选择[ADO.NET实体数据模型] ...
- Entity Framework入门教程:什么是Entity Framework
Entity Framework简介 Entity Framework是微软提供的一个O/RM(对象关系映射)框架.它基于ADO.NET,为开发人员提供了一种自动化的机制来访问和存储数据库中的数据. ...
随机推荐
- Saltstack_使用指南02_远程执行-验证
1. 主机规划 2. Master与哪些minion通信 2.1. Master与哪些minion正常通信 [root@salt100 ~]# salt '*' test.ping salt100: ...
- IDEWorkspaceChecks.plist文件是干什么用的?
在提交PR的时候,无意间发现了在xcworkspace/xcshareddata中多了一个名为IDEWorkspaceChecks.plist的文件.自己并没有手动创建此文件,在网上查了一下,最终对其 ...
- mysql创建唯一索引,避免数据重复插入
多台服务器使用一个数据库时,有时就会出现重复插入的情况,eg:people表中的姓名和身份证号 此时可以给姓名和身份证号创建唯一索引, 创建语句:alter table people add uniq ...
- HBase工具:如何查看HBase的HFile
root@root:~/Desktop/sourceCodes/hbase-2.1.1/bin# ./hbase Usage: hbase [<options>] <command& ...
- Flink流处理的时间窗口
Flink流处理的时间窗口 对于流处理系统来说,流入的消息是无限的,所以对于聚合或是连接等操作,流处理系统需要对流入的消息进行分段,然后基于每一段数据进行聚合或是连接等操作. 消息的分段即称为窗口,流 ...
- web框架开发-Django模型层(2)-多表操作
很重要,都是精华 多表关系模型 一对一 一旦确定表关系是一对一,在两张表中的任意一张表中建立关联字段+Unique 一对多 一旦确定表关系是一对多,创建关联字段在多的表中 多对多 一旦确定表关系是多对 ...
- ESP8266当中继
WiFi推原理(转) http://jb.tongxinmao.com/Article/Detail/id/412 https://www.anywlan.com/thread-409913-1-1. ...
- ###20175311MyCP(课下作业,必做)
MyCP(课下作业,必做) 作业题目 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.b ...
- Fabric CA环境的集成
我们前面关于Fabric的所有文章中用到的例子都没有CA Server,都是由cryptogen这个工具根据crypto-config.yaml而生成的.但是在实际生产环境中,我们肯定不能这么做,我们 ...
- mac 利用svn下载远程代码出现Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.
终端输出的信息:Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo. ...