2016-06-13 128 views
3

我们对数据库请求使用ASP.NET Core和EF6。 潜在地,多个用户可以同时访问数据库。我用单元测试来实现这种情况:同时发生多个请求时的意外连接状态

Parallel.For(0, 10, count => { 
    result = userRepo.Sessions.Any(session => session.Token == token); 
}); 

抛出异常:Unexpected connection state. When using a wrapping provider ensure that the StateChange event is implemented on the wrapped DbConnection

这是我完全理解的东西:代码尝试使用相同的连接并行访问数据库,但连接在一个请求完成之前关闭。好吧,但是使用ASP.NET核心和依赖注入,可以在两个请求之间共享相同的连接,因此它可能会像上面的测试一样崩溃。我们使用AddScoped来注册DI容器中的数据库服务。

我有什么我在我们的架构中失踪?

+3

通常,dbcontext将根据请求进行作用域,每个请求都有自己的连接,该连接超出作用域并位于请求的末尾。 –

+3

两个请求**不能**使用相同的连接,因为它们是有作用域的(默认情况下)。 Scoped将为每个请求创建一个DbContext实例。您所尝试的不是ASP.NET Core请求的工作方式。您将不得不为每个循环迭代实例化一个新的用户存储库和一个新的上下文。阅读:你的单元测试是错误的;) – Tseng

+3

如果多个HTTP请求使用同一个'DbContext'实例,那么你做错了。此单元测试正在测试不应发生的情况。 – David

回答

0

经过大量的调查,我们发现了这个问题。我们缓存了整个C#lambda表达式,这些表达式通过实体框架访问数据库,因此从一个HTTP请求到另一个HTTP请求,DbContext是相同的,这就是抛出此异常的原因。