- 实体框架教程
- 实体框架 - 首页
- 实体框架 - 概述
- 实体框架 - 架构
- 实体F - 环境设置
- 实体框架 - 数据库设置
- 实体框架 - 数据模型
- 实体框架 - DbContext
- 实体框架 - 类型
- 实体框架 - 关系
- 实体框架 - 生命周期
- 实体F - 代码优先方法
- 实体F - 模型优先方法
- 实体F - 数据库优先方法
- 实体框架 - 开发方法
- 实体F - 数据库操作
- 实体框架 - 并发
- 实体框架 - 事务
- 实体框架 - 视图
- 实体框架 - 索引
- 实体F - 存储过程
- 实体F - 脱机实体
- 实体F - 表值函数
- 实体框架 - 原生SQL
- 实体框架 - 枚举支持
- 实体F - 异步查询
- 实体框架 - 持久化
- 实体F - 投影查询
- 实体F - 命令日志
- 实体F - 命令拦截
- 实体框架 - 空间数据类型
- 实体框架 - 继承
- 实体框架 - 迁移
- 实体框架 - 急切加载
- 实体框架 - 延迟加载
- 实体框架 - 显式加载
- 实体框架 - 验证
- 实体框架 - 跟踪更改
- 实体框架 - 彩色实体
- 实体F - 代码优先方法
- 实体框架 - 第一个示例
- 实体框架 - 数据注解
- 实体框架 - Fluent API
- 实体框架 - 种子数据库
- 实体F - 代码优先迁移
- 实体F - 多个DbContext
- 实体F - 嵌套实体类型
- 实体框架资源
- 实体框架 - 快速指南
- 实体框架 - 有用资源
- 实体框架 - 讨论
实体框架 - 延迟加载
延迟加载是指在第一次访问引用实体/实体集合的属性时,自动从数据库加载实体或实体集合的过程。延迟加载意味着延迟加载相关数据,直到您明确请求它。
当使用POCO实体类型时,延迟加载是通过创建派生代理类型的实例,然后重写虚拟属性来添加加载挂钩实现的。
延迟加载几乎是默认设置。
如果您保留默认配置,并且在查询中没有明确告诉实体框架您想要延迟加载以外的其他内容,那么您将获得延迟加载。
例如,当使用Student实体类时,相关的Enrollments将在第一次访问Enrollments导航属性时加载。
导航属性应定义为public,virtual。如果属性未定义为virtual,则Context将**不会**执行延迟加载。
以下是包含Enrollments导航属性的Student类。
public partial class Student {
public Student() {
this.Enrollments = new HashSet<Enrollment>();
}
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public System.DateTime EnrollmentDate { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
}
让我们来看一个简单的例子,其中学生列表首先从数据库加载,然后在您需要时加载特定学生的入学信息。
class Program {
static void Main(string[] args) {
using (var context = new UniContextEntities()) {
//Loading students only
IList<Student> students = context.Students.ToList<Student>();
foreach (var student in students) {
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID: {0}, Name: {1}", student.ID, name);
foreach (var enrollment in student.Enrollments) {
Console.WriteLine("Enrollment ID: {0}, Course ID: {1}",
enrollment.EnrollmentID, enrollment.CourseID);
}
}
Console.ReadKey();
}
}
}
编译并执行上述代码后,您将收到以下输出。
ID: 1, Name: Ali Alexander
Enrollment ID: 1, Course ID: 1050
Enrollment ID: 2, Course ID: 4022
Enrollment ID: 3, Course ID: 4041
ID: 2, Name: Meredith Alonso
Enrollment ID: 4, Course ID: 1045
Enrollment ID: 5, Course ID: 3141
Enrollment ID: 6, Course ID: 2021
ID: 3, Name: Arturo Anand
Enrollment ID: 7, Course ID: 1050
ID: 4, Name: Gytis Barzdukas
Enrollment ID: 8, Course ID: 1050
Enrollment ID: 9, Course ID: 4022
ID: 5, Name: Yan Li
Enrollment ID: 10, Course ID: 4041
ID: 6, Name: Peggy Justice
Enrollment ID: 11, Course ID: 1045
ID: 7, Name: Laura Norman
Enrollment ID: 12, Course ID: 3141
关闭延迟加载
延迟加载和序列化不能很好地混合,如果您不小心,您最终可能会因为启用了延迟加载而查询整个数据库。在序列化实体之前关闭延迟加载是一个好习惯。
关闭特定导航属性的延迟加载
可以通过将Enrollments属性设为非虚拟属性来关闭Enrollments集合的延迟加载,如下例所示。
public partial class Student {
public Student() {
this.Enrollments = new HashSet<Enrollment>();
}
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public System.DateTime EnrollmentDate { get; set; }
public ICollection<Enrollment> Enrollments { get; set; }
}
关闭所有实体的延迟加载
可以通过将Configuration属性上的标志设置为false来关闭上下文中的所有实体的延迟加载,如下例所示。
public partial class UniContextEntities : DbContext {
public UniContextEntities(): base("name = UniContextEntities") {
this.Configuration.LazyLoadingEnabled = false;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
throw new UnintentionalCodeFirstException();
}
}
关闭延迟加载后,现在再次运行上述示例时,您将看到Enrollments未加载,仅检索学生数据。
ID: 1, Name: Ali Alexander ID: 2, Name: Meredith Alons ID: 3, Name: Arturo Anand ID: 4, Name: Gytis Barzduka ID: 5, Name: Yan Li ID: 6, Name: Peggy Justice ID: 7, Name: Laura Norman ID: 8, Name: Nino Olivetto
我们建议您逐步执行上述示例以更好地理解。
广告