EF Core:必须使用using语句才能正确释放DbContext吗?
问题解答
结论:第二种写法无法保证DbContext被正确且及时地释放
原因分析
第一种写法的
await using声明会明确管理DbContext的生命周期:- 当
await ctx.Devices.ToListAsync()执行完成后,await using会自动调用DbContext的DisposeAsync()方法,及时释放数据库连接等资源,这是EF Core推荐的正确用法。
- 当
第二种写法的问题:
- 创建的DbContext是一个临时对象,没有被
using/await using包裹,.NET不会自动触发它的DisposeAsync()。 - 虽然垃圾回收最终会回收这个对象的内存,但数据库连接等非托管资源无法被及时释放,长期运行可能导致数据库连接池耗尽,引发性能问题或报错。
- 创建的DbContext是一个临时对象,没有被
正确做法
始终使用await using(异步场景)或using(同步场景)来包裹DbContext,确保资源被及时释放,就像第一个示例那样。
内容的提问来源于stack exchange,提问作者Avrohom Yisroel
相关产品推荐
相关产品推荐

