【发布时间】:2017-05-16 20:10:35
【问题描述】:
我在使用 Sqlite 运行 Entity Framework Core 的 Dotnet Core 项目中有一个 WebApi 控制器。
动作中的这段代码偶尔会产生错误:
var t1 = _dbContext.Awesome.FirstOrDefaultAsync(a => [...]);
var t2 = _dbContext.Bazinga.FirstOrDefaultAsync(b => [...]);
var r1 = await t1;
var r2 = await t2;
错误是:
Microsoft.EntityFrameworkCore.Query.RelationalQueryCompilationContextFactory:错误: 迭代结果时数据库中发生异常 询问。 System.ObjectDisposedException:安全句柄已关闭
Microsoft.EntityFrameworkCore.Query.RelationalQueryCompilationContextFactory:错误: 迭代结果时数据库中发生异常 询问。 System.InvalidOperationException: ExecuteReader 只能是 连接打开时调用。
对我来说,这两个错误都表明DbContext 发生了一些事情,例如过早处置(尽管不是DbContext 本身)。 DbContext 正在使用 Dotnet Core 的管道“常规方式”注入控制器构造函数,配置如下所示(来自我的 Startup.cs ConfigureServices 方法体):
services.AddDbContext<ApplicationContext>(options => options.UseSqlite(connectionString));
如果我将上面的错误生成代码更改为:
var r1 = await _dbContext.Awesome.FirstOrDefaultAsync(a => [...]);
var r2 = await _dbContext.Bazinga.FirstOrDefaultAsync(b => [...]);
...我没有看到提到的错误,因此得出的结论是在我的DbContext(如上所述注入)的同一实例上同时运行多个任务是导致问题的原因。显然,这是一个意外。
问题:
- 我得出了正确的结论,还是发生了其他事情?
- 您能否指出错误只是偶尔发生的原因?
- 您知道在
DbContext上仍运行并发任务的同时避免该问题的任何简单方法吗?
【问题讨论】:
标签: c# sqlite .net-core entity-framework-core dbcontext