C#使用Entity Framework Core处理数据库(二)

Entity Framework Core(EF Core)是一个轻量级、跨平台的对象关系映射(ORM)框架,用于在.NET应用程序中处理数据库操作。它提供了一种将数据库中的数据映射到.NET对象模型的方法,使开发人员可以使用面向对象的方式进行数据库操作,而无需直接编写SQL语句。
上一篇文章讲了如何在C#中构建EF Core模型:C#使用Entity Framework Core处理数据库(一)

1.查询EF Core模型

在上一篇文章中我们编辑了一个名为"Product"的实体,它具有"id"、"Name"和"Price"属性

public class Product
{public int Id { get; set; }public string Name { get; set; }public decimal Price { get; set; }
}

现在编写一些简单的LINQ查询代码用于从数据库中检索所有产品的名称和价格

using (var context = new YourEfCoreContext())
{var products = context.Products.Select(p => new { p.Name, p.Price }).ToList();
}

过滤结构中返回的实体
"Filtered include"是Entity Framework Core中的一种技术,允许您在加载相关实体时应用过滤条件。这使您能够对关联实体进行过滤,并仅加载符合特定条件的相关数据,而不是加载全部数据。
在EF Core中,通过使用Where和Include方法结合来实现filtered include。这样可以在检索相关实体时应用筛选条件,以减少检索到的数据量并且只获取符合条件的相关数据。
如果您想要在LINQ查询中进行过滤,并包含特定的实体,您可以使用Where来过滤结果,然后使用Include来包含另一个实体。以下是一个示例代码:

using (var context = new YourEfCoreContext())
{var productsWithCategory = context.Products.Where(p => p.Price > 50) // 过滤价格大于50的产品.Include(p => p.Category) // 包含关联的Category实体.ToList();
}

获取生成的SQL
EF Core5.0提供了一种简单快捷的方法来查看生成的SQL
还是上面的例子:

 using (var context = new YourEfCoreContext()){var query = context.Products.Where(p => p.Price > 50).Include(p => p.Category);var sql = query.ToQueryString();Console.WriteLine(sql);}

生成的 SQL 查询语句将是以下内容:
SELECT "p"."Id", "p"."Name", "p"."Price", "p"."CategoryId", "c"."Id", "c"."Name"FROM "Products" AS "p" LEFT JOIN "Categories" AS "c" ON "p"."CategoryId" = "c"."Id" WHERE "p"."Price" > 50

定义全局过滤器
在 Entity Framework Core 中,您可以使用全局查询过滤器来自动应用于所有对数据库上下文执行的查询。这在需要对数据进行软删除或者多租户隔离的情况下特别有用。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{base.OnModelCreating(modelBuilder);// 添加全局过滤器modelBuilder.Entity<Product>().HasQueryFilter(p => !p.IsDeleted);
}

2.使用EF Core加载模式

立刻加载实体
在 Entity Framework Core 中,可以使用 Include 或 ThenInclude 方法来立即加载相关实体。立即加载可以避免延迟加载带来的性能问题,确保在查询时将相关实体一起加载到内存中。

using (var context = new YourEfCoreContext())
{var product = context.Products.Include(p => p.Category).FirstOrDefault(p => p.Id == productId);
}

在上面的示例中,通过调用 Include(p => p.Category) 方法,我们告诉 EF Core 在检索产品时立即加载与之关联的类别实体。这样,在查询结果返回时,产品及其对应的类别会一并加载到内存中。

请注意,过度使用立即加载可能导致性能问题,因为它会在单个查询中检索大量相关数据。在实际应用中,请根据需要谨慎使用立即加载。

启用延迟加载
在 Entity Framework Core 中,默认情况下是不支持延迟加载的。不过,您可以通过安装 Microsoft.EntityFrameworkCore.Proxies 包并启用 UseLazyLoadingProxies 方法来启用延迟加载功能。以下是一个示例:

  1. 首先,安装 Microsoft.EntityFrameworkCore.Proxies 包:
Install-Package Microsoft.EntityFrameworkCore.Proxies
  1. 然后,在创建数据库上下文的地方启用延迟加载:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{base.OnConfiguring(optionsBuilder);optionsBuilder.UseLazyLoadingProxies();
}
  1. 启用了延迟加载后,当您访问导航属性时,相关的实体将会在需要时自动从数据库中加载。例如:
using (var context = new YourEfCoreContext())
{var product = context.Products.FirstOrDefault(p => p.Id == productId);// 延迟加载类别实体var category = product.Category;
}

在这个示例中,当访问 product.Category 时,如果该属性还没有被加载,EF Core 将会立即从数据库中检索相关的类别实体。
请注意,尽管延迟加载提供了便利,但它也可能导致性能问题,并且容易引起 N+1 查询问题。因此,在使用延迟加载时要格外小心。

显示加载实体
另一种加载模式是显示加载,这通常用于在已经获取了一个实体之后,需要加载其相关实体的情况。显式加载允许您在需要时精确控制哪些相关实体被加载,从而避免了不必要的数据加载和性能问题。以下是一个示例:

using (var context = new YourEfCoreContext())
{var product = context.Products.FirstOrDefault(p => p.Id == productId);// 显示加载类别实体context.Entry(product).Reference(p => p.Category).Load();
}

在上面的示例中,我们首先获取了一个产品实体,然后使用 context.Entry(product).Reference(p => p.Category).Load() 来显式加载该产品对应的类别实体。这样可以确保在需要时加载相关实体,而不是默认情况下自动加载。

感谢您阅读本文中关于Entity Framework Core的示例代码和说明。希望这些示例能够帮助您更好地理解在C#中Entity Framework Core(EF Core)的查询和加载模式。如果您有任何其他问题或需要进一步的指导,请随时告诉我。祝您编程愉快!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/756003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试算法-46-三数之和

题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 …

国内 AI 工具集

序号 类型 AI工具名称 入口 功能 聊天/内容生成 1 文心一言 https://yiyan.baidu.com 综合型AI&#xff1a;内容生成、文档分析、图像分析、图表制作、脑图…… 2 通义千问 https://tongyi.aliyun.com 综合型AI&#xff1a;内容生成、文档分析、图像分析…… 3 Kimi(月之暗面…

理论学习:with torch.no_grad()

如果不加上“with torch.no_grad():”&#xff0c;模型参数会发生改变吗&#xff1f; 如果不使用with torch.no_grad():&#xff0c;在进行模型推理&#xff08;即计算outputs_cls net(inputs[batch_size//2:])这一步&#xff09;时&#xff0c;模型参数不会发生改变&#xf…

JAVA实战手册-开篇总述

该专题以实战为出发点&#xff0c;总结概述了实际工作中常用的java知识点&#xff0c;掌握了这些知识点&#xff0c;日常工作开发以及面试都不在话下。 话不多说&#xff0c;直入正题&#xff0c;以下为JAVA知识点概括总结&#xff08;总计涵盖了10大类78小项&#xff09; 针对…

实验7-1-4 选择法排序(PTA)

题目&#xff1a; 本题要求将给定的n个整数从大到小排序后输出。 输入格式&#xff1a; 输入第一行给出一个不超过10的正整数n。第二行给出n个整数&#xff0c;其间以空格分隔。 输出格式&#xff1a; 在一行中输出从大到小有序的数列&#xff0c;相邻数字间有一个空格&am…

关于防火墙

文章目录 一、安全技术和防火墙1、安全技术2、防火墙的分类2.1 按保护范围划分2.2 按实现方式划分2.3 按网络协议划分2.3.1 包过滤防火墙2.3.2 应用层防火墙 二、Linux 防火墙的基本认识1、Netfilter2、防火墙工具介绍2.1 Iptables2.2 Firewalld2.2.1 软件包2.2.2 管理工具 2.3…

在类Unix环境下使用Python

获得并安装Python的最新版本 在Linux中 Python预装在大多数Linux发行版上&#xff0c;并作为一个包提供给所有其他用户。 但是&#xff0c;您可能想要使用的某些功能在发行版提供的软件包中不可用。这时您可以从源代码轻松编译最新版本的Python。 如果Python没有预先安装并且…

【企业战略转型】某音响制造公司发展战略转型管理咨询项目纪实

案例&#xff1a;【客户评价】日本M汽车音响有限公司田总经理&#xff1a;受经济大环境的影响&#xff0c;我公司原有的依赖企业下订单的业务模式受到很大的影响&#xff0c;企业进入“不进则退”的重要转型阶段。当企业生存的关键因素&#xff0c;我们作为典型的OEM汽车音响代…

利用Python爬虫获取xx数据

目录 一、前言 二、requests 请求库 1、requests 安装 2、requests 的基本使用 三、Beautiful Soup 1、Beautiful Soup 安装 2、BeautifulSoup对象介绍与创建 3、BeautifulSoup对象的find方法 四、总结 一、前言 什么是爬虫&#xff1f; 网络爬虫&#xff08;又被称为…

Hack The Box-Devvortex

目录 信息收集 nmap whatweb WEB web信息收集 wfuzz 漏洞探索 漏洞发现 反弹shell 提权 get user hashcat get root 信息收集 nmap 端口信息收集┌──(root?ru)-[~/kali/hackthebox] └─# nmap -p- 10.10.11.242 --min-rate 10000 Starting Nmap 7…

python基于vue考试分析系统的设计和实现-flask-django-nodejs-php

接着&#xff0c;本文还讨论了该系统的设计目的&#xff0c;还讨论了系统的需求&#xff0c;并提出了整体的设计方案。对于该系统的设计和实现&#xff0c;也都进行了较为详细的讨论&#xff0c;并在此基础上&#xff0c;对考试分析系统系统展开了一些具体的测试。随着电子技术…

解决IDEA创建SpringBoot项目没有Java版本8

原因&#xff1a; spring2.X版本在2023年11月24日停止维护了&#xff0c;因此创建spring项目时不再有2.X版本的选项&#xff0c;只能从3.1.X版本开始选择 而Spring3.X版本不支持JDK8&#xff0c;JDK11&#xff0c;最低支持JDK17&#xff0c;因此JDK11也无法选择了 当然&…

24.1 SpringCloud电商实战一刷

24.1 SpringCloud微服务电商项目实战 1. 周介绍2. 功能模块介绍2.1 前台客户端2.2 后台管理端3. Eureka注册中心3.1 创建Eureka服务1. 目录结构2. 依赖引入3. 启动类EurekaServerApplication4. 配置文件application4. 用户模块4.1 核心功能4.2 表结构4.3 用户模块初始化

【代码】YOLOv8标注信息验证

此代码的功能是标注信息验证&#xff0c;将原图和YOLOv8标注文件&#xff08;txt&#xff09;放在同一个文件夹中&#xff0c;作为输入文件夹 程序将标注的信息还原到原图中&#xff0c;并将原图和标注后的图像一同保存&#xff0c;以便查看 两个draw_labels函数&#xff0c;分…

[Linux] 进程间通信基础

&#x1f4bb;文章目录 &#x1f4c4;前言进程间通信基础概念 管道概念管道的工作原理模拟实现shell中的管道 共享内存概念接口的介绍共享内存的使用 &#x1f4d3;总结 &#x1f4c4;前言 你是否了解进程间是如何通信的呢&#xff1f;你是否知道管道的工作原理呢&#xff1f;管…

关于Web端 —— UI自动化测试

在手工测试阶段&#xff0c;针对项目输出了测试用例&#xff0c;如果这些测试用例需要在版本迭代的过程中&#xff0c;需要进行回归测试&#xff0c;通过手工重复地执行测试用例&#xff0c;将会耗费大量的人力。 为此应运而生就有了自动化测试&#xff0c;通过使用自动化工具…

【docker】Docker打包SpringBoot镜像

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;中间件 ⛺️稳中求进&#xff0c;晒太阳 前置说明 最为原始的打包方式spring-boot-maven-plugin插件jib-maven-plugin插件dockerfle-maven-plugin插件 最为原始的方式 也就是使用Docker的打…

从哈希桶角度看 unordered_map 与 unordered_set 的实现

文章目录 一、引言二、C unordered系列的无序关联式容器概览三、基于哈希桶的C unordered系列数据结构模拟实现1、unordered_map的模拟实现2、unordered_set的模拟实现3、哈希桶及其迭代器实现的代码 四、扩展与应用1. 自定义哈希函数2. 其他unordered数据结构unordered_multim…

蓝桥杯/慈善晚会/c\c++

问题描述 热心公益的G哥哥又来举办慈善晚会了&#xff0c;这次他邀请到了巴菲特、马云等巨富&#xff0c;还邀请到了大V、小C等算法界泰斗。晚会一共邀请了n位尊贵的客人&#xff0c;每位客人都位于不同的城市&#xff0c;也就是说每座城市都有且仅有一位客人。这些城市的编号为…

大模型知识库

一种利用 langchain 思想实现的基于本地知识库的问答应用&#xff0c;目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。 1. 下载Langchain-chatchat git clone https://github.com/chatchat-space/Langchain-Chatchat/ 2. 下载大模型和embe…