【问题标题】:ObjectContext and Caching Per Request - Getting ObjectDisposedExceptionObjectContext 和每个请求的缓存 - 获取 ObjectDisposedException
【发布时间】:2011-10-04 20:54:34
【问题描述】:

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

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

这让我相信:

  • HttpContext.Current.Items 集合并非孤立于每个用户一个 HttpRequest,或者:
  • 静态因素会以某种方式影响共享连接的进程和处置,或者:
  • 我需要继续研究一个错误......

有没有人遇到前 2 个项目的问题?是不是我的理解错了?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 2017-11-22
      • 2011-09-28
      • 1970-01-01
      • 2013-02-02
      相关资源
      最近更新 更多