EF Core CRUD本质是操作内存实体状态后调用SaveChanges提交:新增用Add/Attach+Added;查询分跟踪/非跟踪;更新有查后改、Attach+Modified、局部更新;删除分查后删与直接删。

EF Core 的 CRUD 操作本质是围绕 DbContext 和 DbSetSaveChanges() 或 SaveChangesAsync() 提交到数据库。
新增数据(Create)
新增就是把新对象加入 DbSet,并标记为 Added 状态:
- 创建实体实例,赋值必要字段(主键若为自增,可不设;否则需确保唯一)
- 调用
db.Set或.Add(entity) 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→.Remove(entity) SaveChanges -
直接删(无查询):new 一个仅含主键的对象 →
db.Set→.Attach(entity) db.Set(或.Remove(entity) db.Entry(entity).State = EntityState.Deleted)→SaveChanges - 外键约束和级联删除行为由模型配置(
OnDelete)或数据库定义控制
基本上就这些。不复杂但容易忽略的是:所有操作都依赖 DbContext 生命周期管理,记得用 using 或 DI 注入保证上下文及时释放;异步方法(AddAsync、SaveChangesAsync)在 Web 场景更稳妥。










