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)---预先加载、延迟加载、显示加载的更多相关文章

  1. Entity Framework入门教程(13)---EF中的高并发

    EF中的高并发 这里只介绍EF6中database-first开发方案的高并发解决方案,code-first开发方案中的高并发会在以后的EF CodeFirst系列中介绍. EF默认支持乐观并发:我们 ...

  2. Entity Framework入门教程(15)---DbContext追踪实体状态改变

    这一节介绍DbContext追踪实体的变化.EF支持DbContext在其生命周期中自动追踪加载的实体.我们可以通过DbChangeTracker类获取DbContext追踪的所有实体的变化. 注意每 ...

  3. Entity Framework入门教程(1)---Entity Framework简介

    什么是Entity Framework 学习EF的前提:熟练使用Linq和Ado.net,因为在使用EF框架进行开发时,我们大多数情况使用Linq进行查询和操作,而EF的底层实现用的是Ado.net. ...

  4. Entity Framework入门教程(14)---DbFirst下的存储过程

    EF6中DbFirst模式下使用存储过程 我们已经知道EF可以将L2E或Entity SQL的查询语句自动转换成SQL命令,也可以根据实体的状态自动生成Insert/update/delete的Sql ...

  5. ASP .NET MVC 之Entity Framework入门教程及源码

    本文主要的目的是 1. 说明Entity Framework Power Tools如何使用. 2. Entity Framework  快速门 实验环境: OS: Windows Server 20 ...

  6. Entity Framework入门教程:SQLite数据源访问

    [环境安装] 可以通过NuGet直接搜索安装SQLite需要用到的组件 或者直接使用程序包管理器控制台 > Install-Package System.Data.SQLite 通过ADO.NE ...

  7. Entity Framework入门教程: Entity Framework支持的查询方式

    Entity Framework支持的查询方式有三种 LINQ to Entities Entity SQL Native SQL [LINQ to Entities] LINQ(语言集成查询)是从V ...

  8. Entity Framework入门教程:创建实体数据模型

    下图为一个已经创建好的数据库表关系 实体数据模型的创建过程 在Visual Studio项目中,右键程序集菜单,选择[添加]->[新建项],在[添加新项窗口]中选择[ADO.NET实体数据模型] ...

  9. Entity Framework入门教程:什么是Entity Framework

    Entity Framework简介 Entity Framework是微软提供的一个O/RM(对象关系映射)框架.它基于ADO.NET,为开发人员提供了一种自动化的机制来访问和存储数据库中的数据. ...

随机推荐

  1. Java 位运算符和 int 类型的实现

    Java 位运算符和 int 类型的实现 其他运算符 # 算术运算符 +.-.*./.++i.i++.--i.i-- # 关系运算符 ==.!=.>.<.>=.<= # 逻辑运 ...

  2. 5.1Python数据处理篇之Sympy系列(一)---Sympy的大体认识

    目录 目录 前言 目录 前言 sympy是python一个强大的数学符号运算第三方库,具体的功能请看下面操作 官网教程: https://docs.sympy.org/latest/tutorial/ ...

  3. LeetCode算法题-Diameter of Binary Tree(Java实现)

    这是悦乐书的第257次更新,第270篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第124题(顺位题号是543).给定二叉树,您需要计算树的直径长度. 二叉树的直径是树中 ...

  4. sbt安裝與配置

    官方下載地址:https://www.scala-sbt.org/download.html?spm=a2c4e.11153940.blogcont238365.9.42d147e0iF8dhv 解压 ...

  5. velocity模板引擎 -- java.io.FileNotFoundException: velocity.log (Permission denied)

    问题原因是velocity的日志框架导致(velocity是使用自己封装的日志框架记录日志的),velocity在初始化Logger时,如果没有读取到配置文件,则会使用默认的velocity.log做 ...

  6. CodeChef Dynamic GCD

    嘟嘟嘟vjudge 我今天解决了一个历史遗留问题! 题意:给一棵树,写一个东西,支持一下两种操作: 1.\(x\)到\(y\)的路径上的每一个点的权值加\(d\). 2.求\(x\)到\(y\)路径上 ...

  7. C++ cmake

    cmake_minimum_required(VERSION 2.8) project(helloworld) option add_exectuable 告诉工程生成一个可执行文件. add_lib ...

  8. STM32F103/429串口IAP+Ymodem升级

    起因: 串口IAP升级在正点原子的例程中有讲解,正点原子的方法是:在RAM中开辟一个120K的数据空间,用来存放bin文件,bin文件通过串口一次性发送到单片机,然后再实现程序的跳转.但是这种方法在实 ...

  9. SaxReader读取xml

    package com.java1234.action; import java.io.File; import java.util.List; import org.dom4j.Document; ...

  10. VUE实例方法添加、COOKIE、Token

    创建COOKIE const COOKIE = { KEY_TOKEN: 'access_token', KEY_USER: 'nbuser', KEY_PERMISSION: 'nb-permiss ...