实体框架:偶尔会出现不同的连接问题

时间:2017-02-13 15:21:23

标签: c# asp.net-mvc entity-framework entity-framework-6

在过去的几天里,我们正在记录实体框架(版本6)在我们的现场舞台上抛出的不同异常,这些异常仅偶尔出现并显示错误消息,这些消息都与数据库连接有关。

  
      
  • 不允许更改“ConnectionString”属性。该   连接的当前状态已关闭。

  •   
  • 创建模型时无法使用上下文。这个   如果在内部使用上下文,则可能抛出异常   OnModelCreating方法或者如果访问相同的上下文实例   并发多个线程。请注意DbContext的实例成员   并且不保证相关的类是线程安全的。

  •   
  • 意外的连接状态。使用包装提供商时确保   StateChange事件是在包装的DbConnection上实现的。

  •   
  • 基础提供商在Open上失败。

  •   

我们不记得我们已经改变了什么,并且已经说过这些错误有时只会发生。我们无法在当地舞台上重现它们。

有没有人知道出了什么问题或如何调查?

编辑:这是一个ASP.NET MVC 5应用程序,它使用Unity IoC进行实例化。我们使用自编写的PerRequestLifeTimeManager,它在其他mvc应用程序中运行绝对流畅。

1 个答案:

答案 0 :(得分:1)

感谢@Gerd Arnold和@Chris Pratt的暗示,我能够找出问题的根本原因。

确实是由多个请求同时使用的DbContext实例引起的异常。此DbContext是通过Unity属性注入注入动作过滤器的服务的一部分。我还不知道的是,动作过滤器不会在APS.NET MVC中按照请求进行实例化,但它们会被缓存并重用。 所以不要将DbContext或基于DbContext的类的实例注入动作过滤器中!

我们通过调用DependencyResolver.Current.GetService<ClassType>()而不是在我们的过滤器代码中使用Dependency - 属性来解决该问题,以获取相应依赖项的实例(请注意,您失去了可测试性过滤此解决方法)

我花了很多时间才找到解决方案。对于偶尔遇到我的问题中提到的相同错误的用户,我建议检查您的应用程序是否可以在请求/线程中同时使用任何基于DbContext的类。

  1. 检查Unity IoC规则
  2. 查找未通过IoC实例化但可能同时使用的类。
  3. 检查MVC request lifecycle
  4. 上的所有步骤