在我的Web应用程序中,我们使用每个请求DbContext。我们在Application_BeginRequest()中创建DbContext,将其存储在HttpContext.Items中,然后在Application_EndRequest()中调用Dispose。
我们通过包装类DatabaseContext.Current属性提供当前上下文。
偶尔,在针对此数据库上下文执行查询时,我们会收到以下异常:
“ObjectContext实例已被释放,不能再用于需要连接的操作”。
我已经在我们的代码中搜索了我们在其他地方调用Dispose的任何可能性....我们不是。
通常失败的查询是这一个:
var user = (from u in DatabaseContext.Current.Users
where u.UserName == username
select u).FirstOrDefault();
return user != null;
我所能想到的是,在EF的内容深处,它在缓存的查询计划中保留对DbContext的引用,然后在执行查询时尝试重用该上下文。我通过反射器看了它,看起来有些内部会保留对ObjectContext的引用。
有没有办法禁用linq查询缓存?有人有任何线索吗?
另一种可能性是来自上一次调用Context的查询使Context处于错误状态。但是,没有迹象表明会出现这种情况。
这是使用Sql CE的Entity Framework 4.1(现在,我们很快就会迁移到生产SQL Server实例)。
答案 0 :(得分:1)
您的任何一种情况都不应该发生。你提到没有缓存。您应该检查一些可能性:
EndRequest
之后或当前HttpRequest
范围没有自动LINQ查询缓存 - 它是为即将发布的EF版本计划的功能,但该功能可以独立于上下文缓存DbCommand
个实例。
答案 1 :(得分:0)
你得到这个异常“ObjectContext实例已被处理,不能再用于需要连接的操作” - 因为在尝试访问数据查询之后有一个失败的事务。尝试捕获并观察异常。确切地说,有一个例外,处理不当。