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

运行:

相关推荐
想用offer打牌11 分钟前
面试官问:Redis和MySQL数据一致,为什么还需要MySQL?🤠
数据库·redis·mysql
chen.@-@29 分钟前
后端下载限速(redis记录实时并发,bucket4j动态限速)
数据库·redis·缓存
王小小鸭39 分钟前
【Oracle APEX开发小技巧12】
数据库·oracle
噼里啪啦啦.44 分钟前
Spring事务和事务传播机制
数据库·sql·spring
搬码红绿灯1 小时前
MySQL主从复制深度解析:原理、架构与实战部署指南
数据库·mysql·架构
呼拉拉呼拉1 小时前
Redis高可用架构
数据库·redis·架构·高可用架构
却尘1 小时前
当全世界都在用 Rust 重写一切时,Prisma 却选择了反方向
前端·数据库·orm
藥瓿锻1 小时前
2024 CKA题库+详尽解析| 15、备份还原Etcd
linux·运维·数据库·docker·容器·kubernetes·cka
[email protected]1 小时前
ASP.NET Core SignalR - 部分客户端消息发送
后端·asp.net·.netcore
bbsh20991 小时前
WebFuture:Ubuntu 系统上在线安装.NET Core 8 的步骤
linux·ubuntu·.netcore·webfuture