Entity Framework Core延迟加载(懒加载)用法

众所周知在EF 6 及以前的版本中,是支持懒加载(Lazy Loading)的,可惜在EF Core 并不支持,必须使用Include方法来支持导航属性的数据加载。不过现在EF Core的开发团队打算恢复对这一功能的支持(目前还未发布,不过可以在Github上面下载进行测试)。

懒加载

懒加载也可以叫做按需加载、延迟加载。可以分两方面来理解,一方面指暂时不需要该数据,不用在当前马上加载,而可以推迟到使用它时再加载;另一方面指不确定是否将会需要该数据,所以暂时请不要加载,待确定需要后再加载它。懒加载是一种很重要的数据访问特性,可以有效地减少与数据源的交互(注意,这里所提的交互不是指交互次数,而是指交互的数据量),从而提升程序性能。

EF 6 懒加载

我们先来看一看在EF 6中的懒加载的使用方式。

实体定义:

    public class Order
    {
        public int OrderID { get; set; }
        public string CustomerID { get; set; }

        public DateTime? OrderDate { get; set; }

        public virtual ICollection<OrderDetail> OrderDetails { get; set; }
    }

    public class OrderDetail
    {
        public int OrderID { get; set; }
        public int ProductID { get; set; }
        public decimal UnitPrice { get; set; }
        public short Quantity { get; set; }
        public float Discount { get; set; }
        public virtual Order Order { get; set; }
    }

我们在这里定义订单、订单明细实体,它们是一对多关系,通过OrderId字段进行关联。

        using (NorthwindContext context = new NorthwindContext()) {

            Order order = await context.Orders.SingleAsync(item => item.OrderID == 10253);

            Assert.NotNull(order);

            Assert.NotNull(order.OrderDetails);

            Assert.Equal(3, order.OrderDetails.Count);
        }
    }

在查询订单号为 10253 的订单后,如果我们需要访问订单的明细,不需要再编写一次数据查询的代码,直接访问导航属性即可,EF会自动帮我们填充属性的值。

懒加载需要注意以下两点:

  • 在配置中启用了懒加载(默认开启);
  • 实体类不能是封闭(sealed)类,导航属性必须是虚(virtual)属性。

在 EF Core 中启用懒加载

目前EF Core发布的最新版本中并不支持懒加载,开发人员必须使用Include方法,才能完成导航属性的加载。

        using (NorthwindContext context = new NorthwindContext()) {

            Order order = await context.Orders.Include(e => e.OrderDetails).SingleAsync(item => item.OrderID == 10253);

            Assert.NotNull(order);

            Assert.NotNull(order.OrderDetails);

            Assert.Equal(3, order.OrderDetails.Count);
        }

大家需要在Github上面下载最新的源代码来测试这一功能 aspnet/EntityFrameworkCore

启用懒加载:

    public class NorthwindContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            var sqlConnectionStringBuilder = new SqlConnectionStringBuilder {
                DataSource = "****",
                InitialCatalog = "Northwind",
                UserID = "sa",
                Password = "sa"
            };

            optionsBuilder.UseSqlServer(sqlConnectionStringBuilder.ConnectionString);

            optionsBuilder.UseLazyLoadingProxies();

            base.OnConfiguring(optionsBuilder);
        }

    }

要在通常的应用程序中使用,只需在DbContextOnConfiguring方法中添加对UseLazyLoadingProxies()扩展方法调用即可。

框架目前是通过Castle.Core框架来生成代理类来实现对导航属性的延迟加载,开发团队打算将该功能做为EF Core的可选安装包。

到此这篇关于Entity Framework Core延迟加载(懒加载)用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Entity Framework Core生成列并跟踪列记录

    注意:我使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final).正式版发布时,功能可能存在变动. 当您设计数据库时,有时需要添加列以跟踪记录何时更改,以及谁进行了更改.例如,您添加以下列: CreatedAt CreatedBy LastUpdatedAt LastUpdatedBy 您可以轻松地使用默认值和触发器来处理CreatedAt和LastUpdatedAt列.老实说,创建触发器是件无聊的事情,你也不想自己做.此外,很难设置用户名,因为

  • ASP.NET Core在WebApi项目中使用MiniProfiler分析Entity Framework Core

    安装配置MiniProfiler 在现有的ASP.NET Core MVC WebApi 项目里,通过Nuget安装MiniProfiler: Install-Package MiniProfiler.AspNetCore.Mvc MiniProfiler.EntityFrameworkCore 当然也可以通过Nuget Package Manager可视化工具安装 接下来就是如何配置和使用 MiniProfiler 了,总共分三步: 第一步,来到Startup.cs的ConfigureServ

  • Entity Framework Core实现Like查询详解

    在Entity Framework Core 2.0中增加一个很酷的功能:EF.Functions.Like(),最终解析为SQL中的Like语句,以便于在 LINQ 查询中直接调用. 不过Entity Framework 中默认提供了StartsWith.Contains和EndsWith方法用于解决模糊查询,那么为什么还要提供EF.Functions.Like,今天我们来重点说说它们之间的区别. 表结构定义 在具体内容开始之前,我们先简单说明一下要使用的表结构. public class C

  • Entity Framework Core工具使用命令行

    命令列表 Cmdlet Description -------------------------- --------------------------------------------------- Add-Migration Adds a new migration. Drop-Database Drops the database. Get-DbContext Gets information about a DbContext type. Remove-Migration Remov

  • Entity Framework Core中执行SQL语句和存储过程的方法介绍

    无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public class Category { public int CategoryID { get; set; } public string CategoryName { get; set; } } 在Category定义了两个字段:CategoryID.CategoryName. public class Sam

  • Entity Framework Core批处理SQL语句

    在Entity Framework Core (EF Core)有许多新的功能,最令人期待的功能之一就是批处理语句.那么批处理语句是什么呢?批处理语句意味着它不会为每个插入/更新/删除语句发送单独的请求,它将在数据库的单次请求中批量执行多个语句.在这篇文章中,让我们看看它是如何工作的,并将结果与EF6进行比较. EF Core将一次准备多个语句,然后在单次请求中执行它们,所以能提供了更好的性能和速度.让我们看看它是如何工作的.我们将借助SQL Server Profiler来捕获实际生成和执行的

  • Entity Framework Core实现软删除与查询过滤器

    注意:我使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final).正式版发布后,功能可能存在变动. 继续探索Entity Framework Core 2.0,今天我将探讨如何轻松使用软删除(或逻辑删除).我的意思是以透明的方式实现软删除,例如,您是物理上的删除行. 要实现软删除,您需要添加一列以指示该行数据是否被逻辑删除.如果您想知道该行被删除,可以使用布尔列,如果您想知道删除的时间,可以使用日期列.其次是更改所有查询,使用此列过滤结果集:您还

  • Entity Framework Core关联删除

    目录 数据库关联删除行为 定义实体 Fluent API 配置关联实体 创建表结构 EF Core 关联实体删除行为 总结 DeleteBehavior.Cascade DeleteBehavior.SetNull DeleteBehavior.ClientSetNull DeleteBehavior.Restrict 关联删除通常是一个数据库术语,用于描述在删除行时允许自动触发删除关联行的特征:即当主表的数据行被删除时,自动将关联表中依赖的数据行进行删除,或者将外键更新为NULL或默认值. 数

  • 详解如何在ASP.NET Core中应用Entity Framework

    首先为大家提醒一点,.NET Core和经典.NET Framework的Library是不通用的,包括Entity Framework! 哪怎么办? 别急,微软为.NET Core发布了.NET Core版本的Entity Framework,具体配置方法与经典.NET Framework版本的稍有区别,下面的内容就为带领大家在ASP.NET Core中应用Entity Framework DB first. 注:目前部分工具处于Preview版本,正式版本可能会稍有区别. 前期准备: 1.推

  • Entity Framework Core延迟加载(懒加载)用法

    众所周知在EF 6 及以前的版本中,是支持懒加载(Lazy Loading)的,可惜在EF Core 并不支持,必须使用Include方法来支持导航属性的数据加载.不过现在EF Core的开发团队打算恢复对这一功能的支持(目前还未发布,不过可以在Github上面下载进行测试). 懒加载 懒加载也可以叫做按需加载.延迟加载.可以分两方面来理解,一方面指暂时不需要该数据,不用在当前马上加载,而可以推迟到使用它时再加载:另一方面指不确定是否将会需要该数据,所以暂时请不要加载,待确定需要后再加载它.懒加

  • Entity Framework主从表数据加载方式

    一.延迟加载:LazyLoading 使用延迟加载,关联的实体必须标注为virtual. 本例是标注Destination类里的Lodgings为virtual.因为先发sql去查询主键对象,然后根据主键id去从表里查相关联的数据. private static void TestLazyLoading() { using (var context = new CodeFirst.DataAccess.BreakAwayContext()) { var canyon = (from d in c

  • Vue代码分割懒加载的实现方法

    什么是懒加载 懒加载也叫延迟加载,即在需要的时候进行加载,随用随载. 为什么需要懒加载 在单页应用中,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多,延时过长,不利于用户体验,而运用懒加载则可以将页面进行划分,需要的时候加载页面,可以有效的分担首页所承担的加载压力,减少首页加载用时 如何与webpack配合实现组件懒加载 1.在webpack配置文件中的output路径配置chunkFilename属性 output: { path: reso

  • JPA @Basic单表查询如何实现大字段懒加载

    JPA @Basic单表查询实现大字段懒加载 近期看了JPA@Basic注解的使用,看到该注解可以设置字段的懒加载. 1.以前碰到的懒加载: 我们知道,多表关联的时候,我们是可以配置懒加载的,比如一个Company类,里面可以关联员工表,办公设备表,当我们查看公司信息的时候,我们并不需要直接加载员工表,办公设备表,只需要在用户查看员工,查看设备的时候再加载,这样可以提高加载效率. 长话短说,大概是这样子的 @Entity @Table(name = "Company") public

  • Kotlin对象的懒加载方式by lazy 与 lateinit 异同详解

    目录 前言 lateinit by lazy 总结 前言 属性或对象的延时加载是我们相当常用的,一般我们都是使用 lateinit 和 by lazy 来实现. 他们两者都是延时初始化,那么在使用时那么他们两者有什么区别呢? lateinit 见名知意,延时初始化的标记.lateinit var可以让我们声明一个变量并且不用马上初始化,在我们需要的时候进行手动初始化即可. 如果我们不初始化会怎样? private lateinit var name: String findViewById<Bu

  • 浅谈vue中使用图片懒加载vue-lazyload插件详细指南

    在vue中使用图片懒加载详细指南,分享给大家.具体如下: 说明 当网络请求比较慢的时候,提前给这张图片添加一个像素比较低的占位图片,不至于堆叠在一块,或显示大片空白,让用户体验更好一点. 使用方式 使用vue的 vue-lazyload 插件 插件地址:https://www.npmjs.com/package/vue-lazyload 案例 demo: 懒加载案例demo Installation 安装方式 npm $ npm i vue-lazyload -D CDN CDN: https:

  • 详解jQuery lazyload 懒加载

    Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预加载的处理方式正好是相反的. 在包含很多大图片长页面中延迟加载图片可以加快页面加载速度. 浏览器将会在加载可见图片之后即进入就绪状态. 在某些情况下还可以帮助降低服务器负担. Demo页面: 基本选项 淡入效果 对不支持JavaScript浏览器的降级处理 水平滚动 容器内水平滚动 容器内垂直滚动

  • 浅谈Angular2 模块懒加载的方法

    当项目变得复杂庞大以后,如果所有页面都在一个模块里,就会出现首页加载慢的问题,因为首页就已经把整个项目加载进来了.所以,很有必要根据业务将不同的功能分模块,以便Angular2按需加载,提升用户体验. 下面的例子是将首页放到home模块里,访问/home时加载home模块内容,仅供学习懒加载,其实首页访问路径应该是/ 先看项目文件结构: home模块放到src/app/home目录下,里面的home目录是home组件. home模块有单独的定义和路由(home.module.ts,home-ro

随机推荐