[英]Correct pattern for DbContext use in MVC/EF6/WebApi2 application
我希望最终能够解决Entity Framework DbContexts持续存在的问题。 我的问题的历史是零星的 - 特别是当请求快速连续进入时 - 我的DbContext抛出了各种奇怪的错误,包括以下内容:
System.InvalidOperationException :已经有一个与此命令关联的打开DataReader,必须先关闭它。
System.InvalidOperationException :内部连接致命错误。
我的MVC代码基于一个基本模式,我有一个基本控制器,如下所示:
public class BaseController : Controller
{
protected readonly DbContext db = new DbContext();
protected override void Dispose(bool Disposing)
{
db.Dispose();
base.Dispose(disposing);
}
}
所有其他控制器都派生自此基本控制器,从而使DbContext可用于控制器操作,其中任何一个都不是异步的。 唯一的例外是我的自定义授权,它也会在访问时创建一个DbContext,几乎每个控制器操作都会调用它(通过属性):
public class MyAuthorizeAttribute : AuthorizeAttribute
{
private DbContext db;
protected override bool IsAuthorized(HttpActionContext actionContext)
{
db = new DbContext();
var user =
db.Security.FirstOrDefault(u =>
u.Id == actionContext.ControllerContext.Request.Headers.First(h =>
h.Key == "Id").Value);
return (user != null);
}
}
我也试过以下无济于事:
通过StackOverflow,其他人似乎遇到了类似的问题:
这两个答案都没有真正帮助我解决问题的根源 ,但第二个SO帖子的OP答案说(“经过进一步调查后我发现请求处理线程有时从其他线程窃取DbContext”) ,但我不是确定这是如何真正适用的。
我的设计是否存在根本性的问题? 将每个控制器操作的DbContext包装到一个使用块中是不对的,即使这篇博客说它是 - 但不会导致其他问题,例如返回不再附加到DbContext的对象(因此会丢失更改跟踪) )...?
当请求快速连续进入时
让我想起一年前的一个问题所以我认为它与EF6无关。 然而,我花了很长时间才弄明白。
允许您的数据库每个应用程序有多个待处理请求。 将您的连接字符串更改为MultipleActiveResultSets = True
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.