ObjectContext和每个请求的缓存 - 获取ObjectDisposedException

时间:2011-10-04 20:54:35

标签: .net asp.net entity-framework entity-framework-4 objectcontext

我正在使用ObjectContext并将其存储在HttpContext.Current.Items集合中。我为单个请求共享ObjectContext,但框架还允许通过打开标志来加载ObjectContext的新的,非缓存的,不同的副本。这样,对于某些情况,我可以完全绕过HTTPContext。这是有正当理由的;一个是我有各种使用ObjectContext的静态引用,因此每个静态引用都有自己的副本。其他情况是特定过程可能以孤立的方式运行,因此,它必须是唯一的。

我正在尝试在页面卸载中处理共享的ObjectContext,并且偶尔可以正常工作,但是我不时地在请求中获取ObjectDisposedExceptions(因为某些进程尝试读取数据并调用它)。我的意思是我一次得到这个异常,调用回发,并在该请求上得到错误,以及下一个请求。关闭并重新打开浏览器有效,但之后我偶尔会收到错误。这是随机的;一次页面工作,后来没有。它是同一页面,因此它不是逻辑错误。

这让我相信:

  • 每个用户不会将HttpContext.Current.Items集合隔离到一个HttpRequest,或者:
  • 静态以某种方式影响进程和处理共享连接OR:
  • 我需要继续研究一个错误......

有没有人遇到前两项的问题?我的理解错了吗?

1 个答案:

答案 0 :(得分:0)

前两项都不应该发生。每个HTTP请求处理肯定使用HttpContext,如果静态不访问HttpContext,它们不应该影响您的上下文。

这种随机行为还有其他原因。确保您不在请求之间共享代理/附加实体(通过会话或缓存),或者在处理静态上下文后使用它们。

默认情况下,所有POCO实体都被代理,并且它们在内部保持对上下文的引用。动态变更跟踪和延迟加载需要对上下文的引用。因此,如果在处置上下文之前未手动分离实体,它将继续引用已处理的实体,并且第一次数据修改或对高速缓存实体上未加载的导航属性的访问将引发此异常。基于EntityObject的实体也会这样做。