EF Core如何进行CRUD操作 EF Core增删改查方法详解

来源:这里教程网 时间:2026-02-21 17:38:01 作者:

EF Core 的 CRUD 操作本质是围绕 DbContextDbSet 展开的,核心逻辑就一句话:先操作内存中的实体状态,再调用

SaveChanges()
SaveChangesAsync()
提交到数据库。

新增数据(Create)

新增就是把新对象加入 DbSet,并标记为

Added
状态:

创建实体实例,赋值必要字段(主键若为自增,可不设;否则需确保唯一) 调用
db.Set<t>.Add(entity)</t>
AddRange(entities)
批量添加
执行
db.SaveChanges()
—— 此时 EF Core 才真正生成 INSERT SQL 并执行
如果主键是数据库自动生成(如 IDENTITY),EF Core 会自动回填该值到实体中

查询数据(Read)

查询不触发写入,但分“跟踪查询”和“非跟踪查询”两种模式:

默认查询(如
db.Users.ToList()
db.Users.Find(id)
)是跟踪查询,返回的实体状态为
Unchanged
,后续修改能被 EF 自动感知
非跟踪查询用
.AsNoTracking()
,性能略高,适合只读场景,但改完不能直接 SaveChanges
支持 LINQ 方法链(
Where
OrderBy
Select
Include
等)和查询语法(
from ... in ... where ... select

更新数据(Update)

更新的关键在于让 EF Core “知道哪个实体要改”,有三种常用方式:

查后改:先
Find
FirstOrDefault
获取实体 → 修改属性 →
SaveChanges
(EF 自动识别为
Modified
Attach + 修改状态:new 一个带主键的对象 →
db.Entry(entity).State = EntityState.Modified
SaveChanges
(此时所有字段都会被更新)
局部更新(推荐):用
Entry(entity).Property(x => x.Name).IsModified = true
显式指定哪些字段要更新,避免覆盖未改字段

删除数据(Delete)

删除也分“查后删”和“直接删”,区别在于是否从数据库加载实体:

查后删:先查出实体 →
db.Set<t>.Remove(entity)</t>
SaveChanges
直接删(无查询):new 一个仅含主键的对象 →
db.Set<t>.Attach(entity)</t>
db.Set<t>.Remove(entity)</t>
(或
db.Entry(entity).State = EntityState.Deleted
)→
SaveChanges
外键约束和级联删除行为由模型配置(
OnDelete
)或数据库定义控制

基本上就这些。不复杂但容易忽略的是:所有操作都依赖 DbContext 生命周期管理,记得用

using
或 DI 注入保证上下文及时释放;异步方法(
AddAsync
SaveChangesAsync
)在 Web 场景更稳妥。

相关推荐