众所周知在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的可选安装包。

如果您对该功能感兴趣,可以在Github上面下载源代码进行测试。

原文地址:https://www.cnblogs.com/tdfblog/p/entity-framework-lazy-loading.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

Entity Framework Core 懒加载相关推荐

  1. bootstrap 数据加载中提示_解决Quartz定时器中查询懒加载数据no session的问题

    作者:下一秒升华 出自:CSDN 原文:blog.csdn.net/u013815546/article/details/53032445 相信大家在web开发过程中一定遇到过一种情况,Class班级 ...

  2. Entity Framework Core 5中实现批量更新、删除

    本文介绍了一个在EntityFramework Core 5中不需要预先加载数据而使用一句SQL语句批量更新.删除数据的开发包,并且分析了其实现原理,并且与其他实现方案做了比较. 一.背景 随着微软全 ...

  3. [翻译] Entity Framework Core in Action 关于这本书

    Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core 书籍.原版地址. 是除了官方文档外另一个学习EF Core的 ...

  4. Entity Framework Core 2.1带来更好的SQL语句生成方案

    微软发布了Entity Framework Core2.1,为EF开发者带来了很多期待已久的特性.EF Core 2.1增加了对SQL GROUP BY的支持,支持延迟加载和数据种子等. EF Cor ...

  5. Entity Framework Core 执行SQL语句和存储过程

    无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public clas ...

  6. Entity Framework Core 批处理语句

    在Entity Framework Core (EF Core)有许多新的功能,最令人期待的功能之一就是批处理语句.那么批处理语句是什么呢?批处理语句意味着它不会为每个插入/更新/删除语句发送单独的请 ...

  7. 在Apworks数据服务中使用基于Entity Framework Core的仓储(Repository)实现

    <在ASP.NET Core中使用Apworks快速开发数据服务>一文中,我介绍了如何使用Apworks框架的数据服务来快速构建用于查询和管理数据模型的RESTful API,通过该文的介 ...

  8. Entity Framework Core 1.1 升级通告

    Entity Framework Core(EF Core)是一个轻量级的,可扩展和实体框架的跨平台版本.今天,我们宣布 Entity Framewor Core 1.1 正式可用了. EF Core ...

  9. Entity Framework Core延期及弃用的特性

    由于破坏了向后兼容性,Entity Framework的名声相当不光彩,但与Entity Framework Core的完全重写相比就相形见绌了.在本文中,InfoQ将着眼于其中部分主要特性的变化及其 ...

最新文章

  1. 如何利用 C# 实现 K 最邻近算法?
  2. 七大行业巨头齐聚神策数据驱动大会,你想知道的都在这里了!
  3. FLASH STUDY LOG
  4. MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)...
  5. .NET 简单的smtp协议发邮件
  6. linux mysql服务基础操作(二)
  7. JSP-BUG-The type java.xx.xx cannot be resolved
  8. iPhone 12全系渲染图曝光:还有无数果粉期待的小屏神机
  9. python 库 镜像_python安装镜像库
  10. TIOBE 6 月编程语言排行榜:Python 势不可挡,或在四年之内超越 Java、C
  11. 运维讨厌流浪地球的原因
  12. access 分表存储_数据库分区、分表、分库、分片
  13. 项目管理ppt_干货:腾讯内部项目管理PPT!
  14. Intellij IDEA 2019 最新优化配置
  15. 中标麒麟Linux能运行wine吗,中标麒麟V6下wine完美运行通达信
  16. [转帖]Photoshop鼻青脸肿效果的照片恶搞教程
  17. Windows Server 2012 R2添加或删除角色和功能时提示无法打开匿名级安全令牌
  18. pytorch的简单教程
  19. 香港特首到访阿里_她是来看几个年轻人的……
  20. 渗透前期学习资源分享

热门文章

  1. SAP的SqlAnyWhere中数据库日志文件删除后如何新建
  2. 利用Xshell实现非对称秘钥对安全登陆linux服务器(Centos、Ubuntu)
  3. Android VNC Server New
  4. 操作系统和数据库的知识梳理(思维导图)
  5. .net6给winform带来的新功能
  6. ABP Framework 5.0 RC.1 新特性和变更说明
  7. .NET Conf 2021 正在进行中,带你看一看微软带来了什么内容
  8. 陈睿学长在CUIT建校70周年校庆上的演讲
  9. NET问答:null != variable 和 variable != null 到底有什么区别?
  10. ASP.NET Core 开源项目 nopCommerce,一款沉淀13年的电商开源佳作!