【发布时间】:2020-10-28 07:14:29
【问题描述】:
我了解DbContext 不是线程安全的,加上DbContext 缓存数据,当多个事务尝试将自己的更改保存/提交到数据库时可能会导致数据不一致。因此,强烈建议按请求注入它 (here)。但我有一种情况,即仅存在读取操作(在独立类库中)并且没有事务或创建/更新/删除操作。
我的问题是:在这种情况下将DbContext 作为单例注入是否安全?
【问题讨论】:
-
我的问题是:为什么?为什么不让依赖注入做它最擅长的事情,并且在很长一段时间内都做得很好呢?你希望通过使用单例获得什么?
-
我会说不,因为虽然没有数据库写入 - EF 本身在从数据库读取时将数据写入其内部结构,当库开发人员明确告诉您时,谁知道多线程时的行为方式库不是线程安全的。
-
@FranzGleichmann 因为 1) 每次调用其方法时,我都会多次调用
dbContext,我需要为每个方法添加using(scope){create dbcontext()}语句,这会污染代码。 2) 每个方法都应该在非常高的音量上被调用,并且每次调用实例化DbContext10 次可能会使服务器瘫痪(即使在使用 DbContextPool 时)。 3)为什么你不反过来想?为什么我们不将它作为单例注入(并切断与作用域DbContext相关的所有麻烦)以这种方式使用它是安全的? -
@Evk "EF 本身在从数据库读取数据的同时将数据写入它的内部结构" 你能给我一个提到的链接吗?
-
不,但这只是常识。您自己说
DbContext缓存数据,这就是写操作(这意味着它将缓存的实体写入内部结构的某处,以便稍后返回)。在他们的 github repo 中也有很多关于线程安全的问题。例如这里:github.com/dotnet/efcore/issues/18148 EF Core dev 再次重复:“DbContext 不是线程安全的。警告部分“EF Core 不支持在同一上下文实例上运行多个并行操作。”适用于 每个操作,而不仅仅是“保存”记录。”
标签: c# .net entity-framework ef-core-3.1