【发布时间】:2011-02-16 15:51:20
【问题描述】:
我一直在使用 StructureMap 将 ObjectContext(实体)与延迟加载的 POCO 类一起注入到我的存储库中。这是我的 Structuremap 注册。
For<WebEntities>().LifecycleIs(new HybridLifecycle()).Use(()=>new WebEntities());
我已针对我的 POCO 类定义了部分类,以检索未在我的 EDMX 架构中定义的信息。例如Community.FloorPlanImages 将是一个吸气剂,它仅从所有可用图像中过滤平面图图像。在我开始优化我的查询之前工作得很好。使用 EFProf,我发现我的所有连接都没有被关闭。我无法使用“使用”语句,因为我将 ObjectContext 本身注入到我的存储库中。因此,我在 Application_EndRequest() 中添加了以下内容。
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
只要我不访问我的部分 POCO 上的任何内容,这也可以。我认为 StructureMap 会在我们到达 Partial 之前关闭连接。我收到以下错误。
ObjectContext 实例已被释放,不能再用于需要连接的操作。
有什么想法可以解决这个问题吗?
更新 - 这是堆栈跟踪
ObjectDisposedException: ObjectContext 实例已 处置,不能再用于 需要连接的操作。] System.Data.Objects.ObjectContext.EnsureConnection() +8550458 System.Data.Objects.ObjectQuery
1.GetResults(Nullable1 forMergeOption) +46
System.Data.Objects.ObjectQuery1.Execute(MergeOption mergeOption) +311.Load(List
System.Data.Objects.DataClasses.EntityCollection1 collection, MergeOption mergeOption) +243 System.Data.Objects.DataClasses.EntityCollection1.Load(MergeOption 合并选项)+25
System.Data.Objects.DataClasses.RelatedEnd.Load() +37 System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad() +8032198 System.Data.Objects.Internal.LazyLoadBehavior.LoadProperty(TItem 属性值,字符串 关系名称,字符串 targetRoleName, Boolean mustBeNull, 对象包装器对象)+85
System.Data.Objects.Internal.c_DisplayClass72.<GetInterceptorDelegate>b__1(TProxy proxy, TItem item) +1012 参数)+208
System.Data.Entity.DynamicProxies.Community_39641A615E1AD4E19D637735C7A1EBEE61BF70BF579CDD4EBB0267E6636BEC62.get_Videos() +55 Rdx.Web.UI.AppCode.Controllers.CDController.GetCDModel(SearchParams searchParams, Int32 page, Boolean isSorting) in D:\Solutions\RDX\Rdx.Mvc\src\app\Rdx.Web.UI\AppCode\Controllers\CDController.cs:365 Rdx.Web.UI.AppCode.Controllers.CDController.Show(Int32 cid, Int32 bid) in D:\Solutions\RDX\Rdx.Mvc\src\app\Rdx.Web.UI\AppCode\Controllers\CDController.cs:70 lambda_method(Closure , ControllerBase , Object[] ) +145
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext 控制器上下文、动作描述符 actionDescriptor,IDictionary2 parameters) +271 续)+263 System.Web.Mvc.c_DisplayClass17.b_14() +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter 过滤器,ActionExecutingContext preContext, Func
System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +55 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func1 continuation) +263 System.Web.Mvc.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14() +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func1 续)+263 System.Web.Mvc.c_DisplayClass17.b_14() +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter 过滤器,ActionExecutingContext preContext, Func1 continuation) +263 System.Web.Mvc.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14() +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func1 续)+263 System.Web.Mvc.c_DisplayClass17.b_14() +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext,IList1 filters, ActionDescriptor actionDescriptor, IDictionary2 个参数)+191
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext 控制器上下文,字符串动作名称) +343 System.Web.Mvc.Controller.ExecuteCore() +116 System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
System.Web.Mvc.c_DisplayClassb.b_5() +37 System.Web.Mvc.Async.c_DisplayClass1.b_0() +21 System.Web.Mvc.Async.c_DisplayClass81.<BeginSynchronous>b__7(IAsyncResult _) +12 System.Web.Mvc.Async.WrappedAsyncResult1.End() +62 System.Web.Mvc.c_DisplayClasse.b_d() +50 System.Web.Mvc.SecurityUtil.b__0(动作 f) +7
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(操作 行动)+22
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult 结果)+9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8841105 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean & completedSynchronously) +184
**更新 2:我的 Application_EndRequest 被击中两次。什么可能导致这种情况发生? **
第一次命中时堆叠。
Nhs.Web.UI.DLL!Nhs.Web.UI.Global.Application_EndRequest(object sender = {ASP.global_asax}, System.EventArgs e = {System.EventArgs}) 第 58 行 C# System.Web.dll!System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 0x95 字节
System.Web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep step = {System.Web.HttpApplication.SyncEventExecutionStep}, ref bool completedSynchronously = true) + 0x4c 字节
System.Web.dll!System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(System.Exception 错误) + 0x13e 字节
System.Web.dll!System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext context, System.AsyncCallback cb, object extraData) + 0xad bytes
System.Web.dll!System.Web.HttpRuntime.ProcessRequestInternal(System.Web.HttpWorkerRequest WR = {System.Web.Hosting.ISAPIWorkerRequestInProcForIIS6}) + 0x1a2 字节
System.Web.dll!System.Web.HttpRuntime.ProcessRequestNoDemand(System.Web.HttpWorkerRequest WR) + 0x7d 字节
System.Web.dll!System.Web.Hosting.ISAPIRuntime.ProcessRequest(System.IntPtr ecb, int iWRType) + 0xfd 字节
[Appdomain 转换]
[本机到托管转换]
第二次命中时堆叠
Nhs.Web.UI.DLL!Nhs.Web.UI.Global.Application_EndRequest(object sender = {ASP.global_asax}, System.EventArgs e = {System.EventArgs}) 第 58 行 C# System.Web.dll!System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 0x95 字节
System.Web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep step = {System.Web.HttpApplication.SyncEventExecutionStep}, ref bool completedSynchronously = true) + 0x4c 字节
System.Web.dll!System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(System.Exception 错误) + 0x13e 字节
System.Web.dll!System.Web.HttpApplication.ResumeStepsWaitCallback(对象错误) + 0x1e 字节
mscorlib.dll!System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(object state) + 0x2d bytes mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态, bool ignoreSyncCtx) + 0xb0 字节
mscorlib.dll!System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() + 0x5a 字节 mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch() + 0x147 字节
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() + 0x2d 字节
[本机到托管转换]
[Appdomain 转换]
[本机到托管转换]
【问题讨论】:
-
您是否检查了堆栈跟踪以查看在失败时触发上下文使用的原因?似乎调用是在请求以某种方式结束之后进行的,或者您在请求结束之前处理了上下文。在上下文中查找杂散的 usings/Dispose 并发布您的堆栈跟踪。
-
我已经在 PHeiberg 上方发布了转储。该页面每次都工作,然后繁荣,它失败了。一旦失败,它就不会恢复。现在把我逼疯了:(
-
您是否使用了 AsyncController 或其他会导致控制器切换线程的异步方法?
-
没有 AsyncController 本身。我确实使用 AJAX 来执行 GET/POST。
标签: entity-framework-4 dependency-injection structuremap objectcontext