await using声明的DbContext应使用SaveChangesAsync还是SaveChanges
问题解答
核心结论
await using语法和SaveChanges/SaveChangesAsync的选择没有绑定关系,使用await using声明DbContext既不会自动帮你保存数据,也不代表你可以直接用同步SaveChanges()替代异步SaveChangesAsync()。
具体说明
await using的作用只有一个:在代码离开当前作用域时,异步调用DbContext的DisposeAsync()方法,释放上下文持有的数据库连接、跟踪缓存等资源。它的逻辑里完全没有自动持久化变更的步骤,如果你不主动调用保存方法,所有Add、Update、Delete操作产生的变更跟踪记录会随着上下文释放直接丢失,根本不会写入数据库。- 选择
SaveChanges()还是SaveChangesAsync()的判断依据只有当前代码的执行上下文,和是否用await using无关:- 如果你写的是异步方法(比如示例中的
async Task<bool> SaveData),始终优先使用await dbContext.SaveChangesAsync()。数据库保存是典型的IO密集型操作,异步写法不会阻塞调用线程,能大幅提升高并发场景下的线程利用率,是EF Core的推荐写法。 - 只有当你完全处于同步代码块、没有异步执行上下文时,才使用同步的
SaveChanges()。在异步方法中强行调用同步SaveChanges(),很容易引发线程池饥饿、甚至数据库连接死锁问题。
- 如果你写的是异步方法(比如示例中的
示例代码笔误修正
你提供的示例代码存在几处书写错误:参数类型strig拼写错误、DbContext类名和实例变量同名易造成混淆、方法末尾多写了一个闭合大括号,修正后的参考写法如下:
public async Task<bool> SaveData(string con, object data) { await using var dbContext = new AppDbContext(con); var myData = new MyData { a = data.a, b = data.b, c = data.c, }; dbContext.MyData.Add(myData); var result = await dbContext.SaveChangesAsync(); return result > 0; }
注意:不要指望DbContext释放时自动保存变更,不管是同步
using还是异步await using,EF Core的上下文释放逻辑都不会包含自动提交变更的步骤,所有数据变更必须手动调用保存方法才会写入数据库。
内容的提问来源于stack exchange,提问作者Mashudu M
相关产品推荐
相关产品推荐

