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

 更新时间:2022年02月22日 16:24:47   作者:Sweet-Tang  
这篇文章介绍了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延迟加载(懒加载)用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • .Net Core自动化部署之利用docker版jenkins部署dotnetcore应用的方法

    .Net Core自动化部署之利用docker版jenkins部署dotnetcore应用的方法

    这篇文章主要给大家介绍了关于.Net Core自动化部署之利用docker版jenkins部署dotnetcore应用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • asp.net6 blazor 文件上传功能

    asp.net6 blazor 文件上传功能

    这篇文章主要介绍了asp.net6 blazor 文件上传,我们今天的所有内容,都要依赖这个接口,因为它可以把流直接传到c#中,这样我们就可以做很多的骚操作了,需要的朋友可以参考下
    2022-05-05
  • asp.net解决上传4M文件限制

    asp.net解决上传4M文件限制

    只需要在服务器上修改如下文件就可以使asp.net突破上传4M文件的限制,大家参考使用吧
    2014-01-01
  • .net core如何使用Redis发布订阅

    .net core如何使用Redis发布订阅

    本篇文章主要介绍了.net core如何使用Redis发布订阅,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • .NET 6新特性试用之常量内插字符串

    .NET 6新特性试用之常量内插字符串

    这篇文章主要介绍了.NET 6新特性试用之常量内插字符串,编写代码时,我们常常需要组合字符串,下面文章对该内容进行详细介绍,需要的小伙伴可以参考一下
    2022-03-03
  • ASP.NET中验证控件的使用方法

    ASP.NET中验证控件的使用方法

    这篇文章主要内容是ASP.NET中验证控件的使用方法,RequiredFieldValidation控件的介绍,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-08-08
  • asp.net+Ligerui实现grid导出Excel和Word的方法

    asp.net+Ligerui实现grid导出Excel和Word的方法

    这篇文章主要介绍了asp.net+Ligerui实现grid导出Excel和Word的方法,实例分析了asp.net结合jQuery的Ligerui插件操作excel和word文件的技巧,需要的朋友可以参考下
    2016-04-04
  • .NET6使用ImageSharp实现给图片添加水印

    .NET6使用ImageSharp实现给图片添加水印

    这篇文章主要为大家详细介绍了.NET6使用ImageSharp实现给图片添加水印功能的相关资料,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-12-12
  • .net 预处理指令符的使用详解

    .net 预处理指令符的使用详解

    这篇文章主要介绍了.net 预处理指令符的使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • .net core实用技巧——将EF Core生成的SQL语句显示在控制台中

    .net core实用技巧——将EF Core生成的SQL语句显示在控制台中

    这篇文章主要介绍了如何将EF Core生成的SQL语句显示在控制台中,帮助大家更好的理解和学习.net core,感兴趣的朋友可以了解下
    2020-08-08

最新评论