【问题标题】:Releasing ObjectContext while using StructureMap使用 StructureMap 时释放 ObjectContext
【发布时间】: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.ObjectQuery1.GetResults(Nullable1 forMergeOption) +46
System.Data.Objects.ObjectQuery1.Execute(MergeOption mergeOption) +31
System.Data.Objects.DataClasses.EntityCollection
1.Load(List1 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) +101
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
2 参数)+208
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext 控制器上下文、动作描述符 actionDescriptor,IDictionary2 parameters) +27
System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +55 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func
1 续)+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.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


【解决方案1】:

试试看

For(typeof(WebEntities)).LifecycleIs(InstanceScope.Hybrid);

Global.asax

protected void Application_EndRequest(object sender, EventArgs e) {
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}

每次访问时,StructureMap 都会存储上下文

var db = ObjectFactory.GetInstance<WebEntities>();

【讨论】:

  • 试过了,但我仍然得到相同的结果。它在部分类的扩展属性上失败。例如public ICollection Images { get { return (from i in this.AllImages where i.VideoId == null select i).ToList(); } }
  • 这与 OP 发布的注册相同,但没有泛型。为什么会有帮助?
  • @Praveen,我会在这里进行测试...@PHeiberg,我只是在“尝试”提供帮助,宅男。 :)
  • 有趣的是,只要我不导航到其他页面,它就可以工作。我将范围设置为 HttpContext,因此您会认为它会在下一个请求时生成一个新实例。出于某种原因,它仍然挂在上一个请求上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 2012-05-18
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多