笔记:使用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个人主页-哔哩哔哩视频

  • 44
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值