EF Core 的 Update 方法默认执行全字段覆盖更新,未赋值字段会被设为 null;推荐先查询再修改以确保安全精准;Attach+IsModified 或 ExecuteUpdateAsync 适用于高效部分更新。
EF Core 的 Update 方法不是“改完就生效”的快捷键,它本质是**告诉上下文:这个实体我打算整体更新,请按它的当前值生成 UPDATE 语句**。用对了省事,用错了会清空字段或性能低下。
当你 new 一个实体、只赋值部分属性(比如只设了 Id 和 Name),再调用 context.Update(entity),EF Core 默认会把所有可映射的非主键字段都写进 SQL 的 SET 子句,未赋值的属性变成 null 或默认值。
var u = new User { UserId = 1, FirstName = "Alice" }; context.Update(u); context.SaveChanges(); → 生成的 SQL 会 SET 所有字段,未赋值字段变 null这是最直观也最不容易出错的方式:从数据库读出完整实体 → 修改需要改的属性 → 调用 SaveChanges()。
var user = context.Users.First(u => u.UserId == 1); user.FirstName = "Bob"; context.SaveChanges();
不想查一次数据库?可以用 Attach() 告诉上下文“这个实体已在数据库中”,再手动标记哪些属性要更新。
context.Attach(entity),此时状态是 Unchanged
context.Entry(entity).Property(x => x.Name).IsModified = true 显式标记要更新的字段SaveChanges() → 只生成含 Name 的 UPDATE 语句如果只更
新一两个字段、且不关心实体生命周期,ExecuteUpdateAsync 是轻量高效的选择(需 EF Core 7 或更高版本):
context.Users.Where(u => u.UserId == 1).ExecuteUpdateAsync(u => u.SetProperty(x => x.FirstName, "Charlie"));
基本上就这些。选哪种方式,关键看你要不要查库、更新字段多不多、是否在意字段被意外清空。日常开发中,查出来再改最稳妥;高频更新单字段时,ExecuteUpdateAsync 或 Attach + IsModified 更合适。