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);}}
要在通常的应用程序中使用,只需在DbContext
的OnConfiguring
方法中添加对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 懒加载相关推荐
- bootstrap 数据加载中提示_解决Quartz定时器中查询懒加载数据no session的问题
作者:下一秒升华 出自:CSDN 原文:blog.csdn.net/u013815546/article/details/53032445 相信大家在web开发过程中一定遇到过一种情况,Class班级 ...
- Entity Framework Core 5中实现批量更新、删除
本文介绍了一个在EntityFramework Core 5中不需要预先加载数据而使用一句SQL语句批量更新.删除数据的开发包,并且分析了其实现原理,并且与其他实现方案做了比较. 一.背景 随着微软全 ...
- [翻译] Entity Framework Core in Action 关于这本书
Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core 书籍.原版地址. 是除了官方文档外另一个学习EF Core的 ...
- Entity Framework Core 2.1带来更好的SQL语句生成方案
微软发布了Entity Framework Core2.1,为EF开发者带来了很多期待已久的特性.EF Core 2.1增加了对SQL GROUP BY的支持,支持延迟加载和数据种子等. EF Cor ...
- Entity Framework Core 执行SQL语句和存储过程
无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public clas ...
- Entity Framework Core 批处理语句
在Entity Framework Core (EF Core)有许多新的功能,最令人期待的功能之一就是批处理语句.那么批处理语句是什么呢?批处理语句意味着它不会为每个插入/更新/删除语句发送单独的请 ...
- 在Apworks数据服务中使用基于Entity Framework Core的仓储(Repository)实现
<在ASP.NET Core中使用Apworks快速开发数据服务>一文中,我介绍了如何使用Apworks框架的数据服务来快速构建用于查询和管理数据模型的RESTful API,通过该文的介 ...
- Entity Framework Core 1.1 升级通告
Entity Framework Core(EF Core)是一个轻量级的,可扩展和实体框架的跨平台版本.今天,我们宣布 Entity Framewor Core 1.1 正式可用了. EF Core ...
- Entity Framework Core延期及弃用的特性
由于破坏了向后兼容性,Entity Framework的名声相当不光彩,但与Entity Framework Core的完全重写相比就相形见绌了.在本文中,InfoQ将着眼于其中部分主要特性的变化及其 ...
最新文章
- 如何利用 C# 实现 K 最邻近算法?
- 七大行业巨头齐聚神策数据驱动大会,你想知道的都在这里了!
- FLASH STUDY LOG
- MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)...
- .NET 简单的smtp协议发邮件
- linux mysql服务基础操作(二)
- JSP-BUG-The type java.xx.xx cannot be resolved
- iPhone 12全系渲染图曝光:还有无数果粉期待的小屏神机
- python 库 镜像_python安装镜像库
- TIOBE 6 月编程语言排行榜:Python 势不可挡,或在四年之内超越 Java、C
- 运维讨厌流浪地球的原因
- access 分表存储_数据库分区、分表、分库、分片
- 项目管理ppt_干货:腾讯内部项目管理PPT!
- Intellij IDEA 2019 最新优化配置
- 中标麒麟Linux能运行wine吗,中标麒麟V6下wine完美运行通达信
- [转帖]Photoshop鼻青脸肿效果的照片恶搞教程
- Windows Server 2012 R2添加或删除角色和功能时提示无法打开匿名级安全令牌
- pytorch的简单教程
- 香港特首到访阿里_她是来看几个年轻人的……
- 渗透前期学习资源分享
热门文章
- SAP的SqlAnyWhere中数据库日志文件删除后如何新建
- 利用Xshell实现非对称秘钥对安全登陆linux服务器(Centos、Ubuntu)
- Android VNC Server New
- 操作系统和数据库的知识梳理(思维导图)
- .net6给winform带来的新功能
- ABP Framework 5.0 RC.1 新特性和变更说明
- .NET Conf 2021 正在进行中,带你看一看微软带来了什么内容
- 陈睿学长在CUIT建校70周年校庆上的演讲
- NET问答:null != variable 和 variable != null 到底有什么区别?
- ASP.NET Core 开源项目 nopCommerce,一款沉淀13年的电商开源佳作!