【发布时间】:2026-02-05 16:30:02
【问题描述】:
我遇到了我存储在 HttpContext.Current.Items 中的 EF4 对象上下文的问题,然后想在请求得到完全处理后立即处理。
在 Aplication_EndRequest 事件中,我调用 RepositoryContext 的 Terminate() 方法,该方法将从 HttpContext.Current.Items 集合中找到活动的 ObjectContext,然后调用 Close() 在它的连接上和 Dispose() 在它上面。
问题是有时我的某个页面会出现奇怪的行为。在某些情况下,我会收到一条错误消息:
ObjectContext 实例已被释放,不能再用于需要连接的操作
我认为这可能会发生,因为不仅页面请求在完成后会调用 Application_EndRequest 事件,而且还会调用图像请求等,因此有时其他请求可能会在主页请求 ObjectContext 完成工作之前对其进行处理,但这不应该发生,因为一切都是在集合 HttpContext.Current.Items 上进行的,这当然不会在 HTTP 请求之间共享。
另外,从研究来看,这可能是由于某些数据库请求的延迟加载引起的,但这里不应该是这种情况,因为我没有在代码的其他任何地方调用 Dispose(我已经检查过),因此 Dispose() on EndRequest 应该只在一切完成时才被调用,不是吗?
关于可能导致此问题的任何想法?我该如何测试它?你有什么建议?
谢谢!
【问题讨论】:
-
收到此错误时堆栈跟踪是什么样的?
-
你能贴出你的 RepositoryContext 类的代码吗?
-
这里是跟踪:img850.imageshack.us/img850/3210/erroryourate.jpg 似乎是因为在操作过程中对象上下文正在被释放。但是,如果我只在 Application_EndRequest 上进行处理,我仍然不明白这是怎么发生的。
-
当我尝试访问某个实体的导航属性时,这似乎只发生在静态扩展方法中。
标签: c# asp.net entity-framework