Entity Framework是否存储了DbC​​ontext以及缓存的查询计划?

时间:2011-09-27 15:08:23

标签: entity-framework

在我的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实例)。

2 个答案:

答案 0 :(得分:1)

您的任何一种情况都不应该发生。你提到没有缓存。您应该检查一些可能性:

  • 您正在EndRequest之后或当前HttpRequest范围
  • 之外使用上下文
  • 您正在从缓存或会话中某处的上下文中检索实体,并在其他请求处理中使用它 - 这可能是一个问题,因为实体可以继续引用已处置的上下文并将其用于某些操作。

没有自动LINQ查询缓存 - 它是为即将发布的EF版本计划的功能,但该功能可以独立于上下文缓存DbCommand个实例。

答案 1 :(得分:0)

你得到这个异常“ObjectContext实例已被处理,不能再用于需要连接的操作” - 因为在尝试访问数据查询之后有一个失败的事务。尝试捕获并观察异常。确切地说,有一个例外,处理不当。