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()类似,也需要将查询设置为不能跟踪。

运行:

相关推荐
wangbing11255 分钟前
SQL Server2008 R2版自动备份问题
数据库
Trouvaille ~11 分钟前
【Redis篇】Redis 渐进式遍历与数据库管理
数据库·redis·缓存·中间件·数据库管理·后端开发·scan
xcLeigh17 分钟前
KES数据库运维监控与故障排查实战
运维·数据库·sql·故障排查·运维监控·kes
GlobalSign数字证书19 分钟前
中小企业的 SSL/TLS 证书管理,有更轻量的方案
数据库·网络协议·ssl
梓䈑23 分钟前
【MySQL】库的操作(数据库的创建、查看、修改 和 备份)
数据库·mysql
yuzhiboyouye40 分钟前
原生 SQL 常用核心语句基础语法
数据库·sql·oracle
我是一颗柠檬41 分钟前
【Redis】事务与Lua脚本Day7(2026年)
数据库·redis·后端·lua·database
流星白龙44 分钟前
【MySQL高阶】14.MySQL存储结构
android·数据库·mysql
一只fish1 小时前
Oracle官方文档翻译《Database Concepts 26ai》第18章-进程架构
数据库·oracle
流星白龙1 小时前
【MySQL高阶】17.InnoDB 内存结构
数据库·mysql·adb