Entity framework 实体框架是否存储它';DBS上下文以及缓存的查询计划?

Entity framework 实体框架是否存储它';DBS上下文以及缓存的查询计划?,entity-framework,Entity Framework,在我的web应用程序中,我们使用的是每请求DbContext。我们在应用程序_BeginRequest()中创建DbContext,将其存储在HttpContext.Items中,然后在应用程序_EndRequest()中对其调用Dispose 我们通过包装类DatabaseContext.current属性使当前上下文可用 偶尔,在对该数据库上下文执行查询时,会出现以下异常: “ObjectContext实例已被释放,不能再用于需要连接的操作” 我已经搜索了我们的代码,寻找我们在其他地方的上下

在我的web应用程序中,我们使用的是每请求DbContext。我们在应用程序_BeginRequest()中创建DbContext,将其存储在HttpContext.Items中,然后在应用程序_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的引用,然后在执行查询时尝试重用该上下文。我已经通过reflector查看了它,它的一些内部似乎保留了对ObjectContext的引用

有没有办法禁用linq查询缓存?有人有线索吗

另一种可能性是,来自上一次上下文调用的查询使上下文处于错误状态。但是,没有故障迹象表明这一点


这是使用Sql CE的Entity Framework 4.1(目前,我们即将迁移到生产Sql Server实例)。

这两种情况都不应该发生。没有你提到的缓存。您应该检查以下几种可能性:

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

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

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

有时你必须在明显的事情向你袭来之前,先打自己几下脑袋。谢谢你的回答。你的第一个子弹原来是由于我的上下文包装中的一个错误。