两个(几乎)并发DbContexts导致问题:如何在Controller和AuthorizeAttribute之间共享

时间:2014-01-13 08:17:08

标签: entity-framework concurrency asp.net-mvc-5 dbcontext entity-framework-6

每隔一段时间,我在ASP.NET / MVC5 / WebAPI2 / EF6 / MSSQL应用程序中遇到以下异常:

  

System.InvalidOperationException:创建模型时无法使用上下文。如果在OnModelCreating方法中使用上下文,或者同时由多个线程访问相同的上下文实例,则可能抛出此异常。请注意,DbContext和相关类的实例成员不保证是线程安全的。

我已将此跟踪到我的授权代码,该代码是AuthorizeAttribute的衍生产品,并实例化其自己的DbContext以验证我的Web API使用者的API密钥是否有效(尝试时发生错误)访问数据库)。

AuthorizeAttribute依次修饰控制器,这些控制器是我BaseController的衍生物,为控制器工作实例化DbContext

尝试对此进行数天的排查并阅读thisthis后,我怀疑每个请求创建两个DbContext个实例是个问题。但是,我不太确定如何只使用一个实例来完成这项工作。我的控制器代码目前很好地在自己创建时实例化DbContext,并在控制器自身处理时透明地处理它。 AuthorizeAttribute完全独立于所有这些,并根据需要创建上下文。

任何模式/想法如何为两个工作单元保留/重用相同的DbContext

1 个答案:

答案 0 :(得分:1)

第一次使用Entity Framework 6开始使用基本应用程序时,我遇到了完全相同的问题。

对我来说,最好的解决方案是在请求生命周期中使用Autofac(使用MVC集成)和Autofac的InstancePerRequest生命周期范围确保只有一个DbContext实例。

如果您对降低依赖注入路线感兴趣(我强烈建议),我建议您熟悉Autofac - 有关您的特定问题的更多信息,请查看davidbitton的回答here - 它会让你走上正确的轨道。