在过去的几天里,我们正在记录实体框架(版本6)在我们的现场舞台上抛出的不同异常,这些异常仅偶尔出现并显示错误消息,这些消息都与数据库连接有关。
不允许更改“ConnectionString”属性。该 连接的当前状态已关闭。
创建模型时无法使用上下文。这个 如果在内部使用上下文,则可能抛出异常 OnModelCreating方法或者如果访问相同的上下文实例 并发多个线程。请注意DbContext的实例成员 并且不保证相关的类是线程安全的。
意外的连接状态。使用包装提供商时确保 StateChange事件是在包装的DbConnection上实现的。
基础提供商在Open上失败。
我们不记得我们已经改变了什么,并且已经说过这些错误有时只会发生。我们无法在当地舞台上重现它们。
有没有人知道出了什么问题或如何调查?
编辑:这是一个ASP.NET MVC 5应用程序,它使用Unity IoC进行实例化。我们使用自编写的PerRequestLifeTimeManager,它在其他mvc应用程序中运行绝对流畅。
答案 0 :(得分:1)
感谢@Gerd Arnold和@Chris Pratt的暗示,我能够找出问题的根本原因。
确实是由多个请求同时使用的DbContext实例引起的异常。此DbContext是通过Unity属性注入注入动作过滤器的服务的一部分。我还不知道的是,动作过滤器不会在APS.NET MVC中按照请求进行实例化,但它们会被缓存并重用。 所以不要将DbContext或基于DbContext的类的实例注入动作过滤器中!
我们通过调用DependencyResolver.Current.GetService<ClassType>()
而不是在我们的过滤器代码中使用Dependency
- 属性来解决该问题,以获取相应依赖项的实例(请注意,您失去了可测试性过滤此解决方法)
我花了很多时间才找到解决方案。对于偶尔遇到我的问题中提到的相同错误的用户,我建议检查您的应用程序是否可以在请求/线程中同时使用任何基于DbContext的类。