EF Core 的 CRUD 操作本质是围绕 DbContext 和 DbSet
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 场景更稳妥。
