当前位置: 首页 > news >正文

笔记:使用Microsoft.EntityFrameworkCore.Proxies做数据库延迟加载

一、目的:

        Microsoft.EntityFrameworkCore.Proxies 是一个Entity Framework Core的扩展包,它提供了对延迟加载的支持。延迟加载是一种ORM(对象关系映射)行为,允许在首次访问导航属性时,自动从数据库加载相关的实体。这意味着,直到你实际需要访问关联的实体时,EF Core不会查询这些实体。


二、实现

要在你的项目中启用延迟加载,你需要做以下几步:


1.    安装包:

首先,确保你的项目中已经安装了Microsoft.EntityFrameworkCore.Proxies包。你可以通过NuGet包管理器来安装这个包。


2.    启用延迟加载:

在你的DbContext的配置中,使用UseLazyLoadingProxies()方法来启用延迟加载。这通常在配置DbContextOptionsBuilder时完成。
例如,根据你提供的文件内容,你可以这样配置:

var optionsBuilder = new DbContextOptionsBuilder<DataContext>();
optionsBuilder.UseLazyLoadingProxies().UseSqlite("Data Source=Migration.db");

 3.    配置导航属性为虚拟(virtual):

为了使延迟加载工作,你需要将你的模型中的导航属性标记为virtual。这允许EF Core在运行时创建导航属性的代理实现,以便在访问属性时自动加载相关实体。

public class SomeEntity
{public int Id { get; set; }public virtual ICollection<RelatedEntity> RelatedEntities { get; set; }
}

        通过这些步骤,你就可以在你的EF Core项目中启用延迟加载了。这样,当你访问一个实体的导航属性时,EF Core会自动从数据库中加载相关的实体,这可以帮助简化查询逻辑,并且在某些情况下提高性能。然而,需要注意的是,过度使用延迟加载可能会导致N+1查询问题,因此在使用时需要谨慎。 

三、如何解决延迟加载可能导致的N+1查询问题?

        延迟加载可能导致所谓的N+1查询问题,这是因为每次访问导航属性时,都会执行一个新的数据库查询。如果在循环中访问多个对象的导航属性,这可能导致执行大量的数据库查询,从而影响应用程序的性能。
解决N+1查询问题的关键是预先加载(eager loading)或显式加载(explicit loading)相关数据,以减少数据库查询的数量。以下是几种解决方案:


1. 预先加载(Eager Loading)


        预先加载是通过Include方法实现的,它允许你指定应该与主查询一起加载的关联数据。这样,EF Core会生成一个包含JOIN操作的SQL查询,一次性加载所有相关数据。

var users = context.Users.Include(u => u.Orders).ToList();

 2. 显式加载(Explicit Loading)


        显式加载是介于延迟加载和预先加载之间的一种方法。它允许你在需要时手动加载关联数据,但与延迟加载不同,你可以一次性加载所有相关数据。

var user = context.Users.Single(u => u.Id == userId);
context.Entry(user).Collection(u => u.Orders).Load();

3. 投影查询(Projection Queries)


        投影查询允许你仅选择需要的数据,而不是加载整个实体。这可以通过LINQ的Select方法实现,它可以显著减少返回的数据量,从而提高性能。

var userOrders = context.Users.Where(u => u.Id == userId).Select(u => new {User = u,Orders = u.Orders}).ToList();

 4. 批量操作


        在某些情况下,如果你需要对大量数据执行相同的操作,考虑使用批量操作库,如Entity Framework Extensions或Entity Framework Plus。这些库提供了批量更新和删除操作,可以减少数据库交互次数。


5. 优化查询


•    仔细分析和优化查询逻辑,避免不必要的导航属性访问。
•    使用分析工具(如SQL Profiler)监控和优化生成的SQL查询。
通过上述方法,你可以有效地解决延迟加载可能导致的N+1查询问题,从而提高应用程序的性能和响应速度。

五、需要了解的知识点

ProxiesExtensions 类 (Microsoft.EntityFrameworkCore) | Microsoft Learn

System.Windows.Controls 命名空间 | Microsoft Learn

六、源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

七、了解更多

System.Windows.Controls 命名空间 | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • E12.【C语言】练习:求两个数的最大公约数
  • Java实现堆排序算法详解及优化
  • JavaWeb(三:JDBC 与 MVC)
  • iOS热门面试题(四)
  • ARM学习(29)NXP 双coreMCU IMX1160学习----NorFlash 启动引脚选择
  • gin源码分析
  • fortran简单排序算法,对一维、二维矩阵进行正序或倒序排序
  • 【深度学习】PyTorch深度学习笔记02-线性模型
  • 百度安全大模型智能体实践入选信通院“安全守卫者计划”优秀案例
  • 专业条码二维码扫描设备和手机二维码扫描软件的区别?
  • 【Java--数据结构】栈:不仅仅是数据存储,它是编程的艺术
  • Docker 容器出现 IP 冲突
  • 深度加速器 为游戏而生
  • 【ARM】CCI缓存一致性整理
  • [论文笔记]RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • go append函数以及写入
  • HTML5新特性总结
  • JavaScript-Array类型
  • vue-cli在webpack的配置文件探究
  • Windows Containers 大冒险: 容器网络
  • 关于使用markdown的方法(引自CSDN教程)
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 记一次用 NodeJs 实现模拟登录的思路
  • 聊聊flink的BlobWriter
  • 前端代码风格自动化系列(二)之Commitlint
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 进程与线程(三)——进程/线程间通信
  • ​io --- 处理流的核心工具​
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #每日一题合集#牛客JZ23-JZ33
  • (1)STL算法之遍历容器
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (Python第六天)文件处理
  • (八十八)VFL语言初步 - 实现布局
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (排序详解之 堆排序)
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (一) springboot详细介绍
  • (转)德国人的记事本
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • ***监测系统的构建(chkrootkit )
  • ./和../以及/和~之间的区别
  • .apk 成为历史!
  • .net 简单实现MD5
  • .NET命名规范和开发约定
  • .Net中ListT 泛型转成DataTable、DataSet
  • .Net中的集合
  • @angular/cli项目构建--Dynamic.Form