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

依赖 `org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.5` 和 `org.springframework:spring-beans:6.2.10` 无法解析,可能由以下原因导致,相应的解决方法如下: ### 仓库配置问题 Maven 或 Gradle 可能没有从正确的仓库下载依赖。若使用 Maven,检查 `settings.xml` 文件中的仓库配置,确保配置的仓库包含所需依赖。例如,可添加 Maven 中央仓库: ```xml <mirrors> <mirror> <id>central</id> <mirrorOf>*</mirrorOf> <url>https://repo.maven.apache.org/maven2</url> </mirror> </mirrors> ``` 若使用 Gradle,在 `build.gradle` 文件中添加仓库配置: ```groovy repositories { mavenCentral() } ``` ### 依赖版本问题 检查依赖版本是否存在或兼容。可到 Maven 中央仓库(https://mvnrepository.com/) 确认 `org.mybatis.spring.boot:mybatis-spring-boot-starter` 和 `org.springframework:spring-beans` 是否有对应的版本。若版本不存在,需更换为可用版本。例如,在 `pom.xml` 中修改依赖版本: ```xml <dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>合适的版本号</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>合适的版本号</version> </dependency> </dependencies> ``` ### 本地仓库缓存问题 本地 Maven 仓库的缓存可能损坏,可删除本地仓库中对应的依赖文件夹,然后重新构建项目。本地仓库默认路径为 `~/.m2/repository`,找到 `org/mybatis/spring/boot/mybatis-spring-boot-starter/3.0.5` 和 `org/springframework/spring-beans/6.2.10` 文件夹并删除,之后重新构建项目。 ### 网络问题 确保网络连接正常,能够访问 Maven 仓库。若网络存在限制,可配置代理。在 `settings.xml` 中配置代理: ```xml <proxies> <proxy> <id>optional</id> <active>true</active> <protocol>http</protocol> <username>proxyuser</username> <password>proxypass</password> <host>proxy.host.net</host> <port>80</port> <nonProxyHosts>local.net|some.host.com</nonProxyHosts> </proxy> </proxies> ``` ### IDE 缓存问题 IDE 可能缓存了旧的依赖信息,可尝试刷新 IDE 的缓存。在 IntelliJ IDEA 中,选择 `File` -> `Invalidate Caches / Restart`,然后重新加载项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值