【发布时间】:2014-01-31 22:07:27
【问题描述】:
每隔一段时间,我都会在我的 ASP.NET/MVC5/WebAPI2/EF6/MSSQL 应用程序中遇到以下异常:
System.InvalidOperationException:创建模型时无法使用上下文。如果在 OnModelCreating 方法中使用上下文,或者多个线程同时访问同一个上下文实例,则可能会引发此异常。请注意,不保证 DbContext 和相关类的实例成员是线程安全的。
我已经将此追溯到我的授权代码,它是AuthorizeAttribute 的派生代码,并实例化了它自己的DbContext 以验证我的Web API 使用者的API 密钥是否有效(尝试访问数据库时发生错误) .
AuthorizeAttribute 反过来装饰控制器,这些控制器是我的 BaseController 的派生,也实例化 DbContext 用于控制器工作。
在尝试解决此问题几天并阅读this 和this 之后,我怀疑每个请求创建两个DbContext 实例是问题所在。但是,我不太确定如何只使用一个实例来完成这项工作。我的控制器代码目前很好地实例化 DbContext 在自己创建时,并在控制器本身处理时透明地处理它。 AuthorizeAttribute 完全独立于这一切,并根据自己的目的创建上下文。
任何模式/想法如何为两个工作单元保留/重用相同的DbContext?
【问题讨论】:
-
我从来没有遇到过这种问题,我使用的方法和你差不多。你介意提供一些代码吗?
-
OnModelCreating在每次应用程序启动时仅调用一次 - 如果您在 Web 应用程序的启动代码中强制 DbContext 初始化会发生什么情况。更好的是 - 如果您使用 IIS 7.5 或更高版本,您应该能够立即运行启动代码,而无需请求触发它。
标签: entity-framework concurrency asp.net-mvc-5 dbcontext entity-framework-6