ASP.NET Core8.0学习笔记(十九)——EF Core DbSet

一、DbSet概述

1.DbSet提供了通过DbContext对表进行查询操作的路径。DbSet对应的属性名称将默认映射为实体T的表名。

2.使用DbSet<T >进行查询的方法:

(1)直接在DbContext中创建对应的DbSet<T >属性

(2)使用DbSet DbContext.Set<T >方法操作数据表。

3.在DbSet<T>中对于数据对象进行的任何操作,都将保存在内存中,只有当SaveChanges()方法被调用时,才会将数据变化提交给数据库。

二、使用DbSet对数据库进行查询

1.在DbContext中没有对应DbSet字段的情况下,使用Set<T >方法对表进行操作:

运行:

三、使用DbSet进行数据更新

1.在EF Core7.0版本以前,要对数据进行更新,我们需要首先把数据查询出来,然后再进行修改。在EF Core7.0以后,可以调用DbSet<T >对象的ExecuteUpdate()方法基于查询结果对数据进行修改。

运行:

我们发现该方法似乎并不起作用。原因是什么?见2

2.ExecuteUpdate()的注意事项:

(1)不同于EF Core一般的数据修改方法:先找数据,重新赋值、删除再调用SaveChanges(),调用ExecuteUpdate()方法将会把修改直接提交到数据库而不会去修改实体的状态,DbContext也无法监测到实体状态的改变。也就是说,上面的代码等价于:

不过,按理来说即使直接提交到数据库,再次执行db.Set<T >.ToList()也会重新从数据库中查询。 但是,EF Core中具有缓存机制,它缓存了我们第一次查询的结果而没有真的再次去查询数据库。

要想解决这个问题,有两种解决方案:

第一,可以重新创建一个数据库上下文:

运行:

第二,为了避免查询结果被缓存,直接让EF Core无法跟踪这个查询就好了,使用AsNoTracking()方法将当前的查询设置为不能追踪:

运行:

注意:即使authors1所属查询可以被跟踪,即不调用AsNoTracking()方法,运行结果也是正确的,经过测试,两个查询只要有一个不可被跟踪,即可保证运行结果正确。

3.一次性更新对象的多个属性:SetProperty()方法支持链式调用,可以使用多个SetProperty()方法一次性更新多个属性。

运行:

四、使用DbSet删除数据

1.在EF Core 7.0以前,要想删除数据,必须先把数据查询出来然后才能删除,在EF Core 7.0及后续版本中,可以使用ExecuteDelete()方法删除数据。注意,与ExecuteUpdate()类似,也需要将查询设置为不能跟踪。

运行:

相关推荐
进击的丸子2 小时前
虹软人脸服务器版SDK(Linux/ARM Pro)多线程调用及性能优化
linux·数据库·后端
NineData18 小时前
NineData智能数据管理平台新功能发布|2026年1-2月
数据库·sql·数据分析
IvorySQL18 小时前
双星闪耀温哥华:IvorySQL 社区两项议题入选 PGConf.dev 2026
数据库·postgresql·开源
ma_king21 小时前
入门 java 和 数据库
java·数据库·后端
jiayou641 天前
KingbaseES 实战:审计追踪配置与运维实践
数据库
NineData2 天前
NineData 迁移评估功能正式上线
数据库·dba
NineData2 天前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师2 天前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
全栈老石2 天前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_3 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库