每隔一段时间,我在ASP.NET / MVC5 / WebAPI2 / EF6 / MSSQL应用程序中遇到以下异常:
System.InvalidOperationException:创建模型时无法使用上下文。如果在OnModelCreating方法中使用上下文,或者同时由多个线程访问相同的上下文实例,则可能抛出此异常。请注意,DbContext和相关类的实例成员不保证是线程安全的。
我已将此跟踪到我的授权代码,该代码是AuthorizeAttribute
的衍生产品,并实例化其自己的DbContext
以验证我的Web API使用者的API密钥是否有效(尝试时发生错误)访问数据库)。
AuthorizeAttribute
依次修饰控制器,这些控制器是我BaseController
的衍生物,也为控制器工作实例化DbContext
。
尝试对此进行数天的排查并阅读this和this后,我怀疑每个请求创建两个DbContext
个实例是个问题。但是,我不太确定如何只使用一个实例来完成这项工作。我的控制器代码目前很好地在自己创建时实例化DbContext
,并在控制器自身处理时透明地处理它。 AuthorizeAttribute
完全独立于所有这些,并根据需要创建上下文。
任何模式/想法如何为两个工作单元保留/重用相同的DbContext
?
答案 0 :(得分:1)
第一次使用Entity Framework 6开始使用基本应用程序时,我遇到了完全相同的问题。
对我来说,最好的解决方案是在请求生命周期中使用Autofac(使用MVC集成)和Autofac的InstancePerRequest生命周期范围确保只有一个DbContext实例。
如果您对降低依赖注入路线感兴趣(我强烈建议),我建议您熟悉Autofac - 有关您的特定问题的更多信息,请查看davidbitton的回答here - 它会让你走上正确的轨道。