EF 更新数据库时减少一次查询

通常,我们在更新一条数据库记录时,EF 先取出这一条记录:

var log = DbContext.MyTable.Find(id);

然后赋值字段并保存:

log.Result = "OK";
DbContext.SaveChanges();

这样就会产生两次数据库查询。


我们尝试用 Attach 方法。

先创建一个仅包含主键的对象:

var log  = new MyTable { Id = id };

将对象附加到上下文:

DbContext.MyTable.Attach(log);

然后更新需要更新的字段:

log.Result = "OK";
DbContext.SaveChanges();

这样,能在保留其它字段值的前提下,减少一次数据库查询。

但是需要注意的是:

当某非 null 字段需要恢复默认值时,EF 会忽略这个更改。(可能会因 EF 版本等原因有不同的结论)

举个例子:

某记录有个 int 型字段 a,在数据库中这个记录的 a 的值为 1,但 C# 中 int 型的默认值为 0,所以当 Attach 附加这个对象后,如果重新设置 log.a 为 0,那么保存后 a 的值仍为 1。


还有一种写法,利用 ExecuteUpdate 方法:

var affectedRows = DbContext.MyTable
  .Where(c => c.Id == id)
  .ExecuteUpdate(setters => setters
    .SetProperty(c => c.Result, "OK")
  );

返回匹配的行数。

这种写法不会遇到“恢复为默认值不生效”的问题,推荐使用。

xoyozo 26 天前
转载请注明出处
可能相关的内容