Выпуск ObjectContext при использовании StructureMap - PullRequest
2 голосов
/ 16 февраля 2011

Я использовал StructureMap для добавления ObjectContext (entity) в мои репозитории вместе с загруженными ленивыми классами POCO. Это моя структура регистрации.

 For<WebEntities>().LifecycleIs(new HybridLifecycle()).Use(()=>new WebEntities());

Я определил частичные классы для моих классов POCO, чтобы получить информацию, которая не определена в моей схеме EDMX. например Community.FloorPlanImages будет получателем, который фильтрует только изображения плана этажа из всех доступных изображений. Работал довольно хорошо, пока я не начал оптимизировать свои запросы. Используя EFProf, я обнаружил, что ни одно из моих соединений не было закрыто. Я не мог использовать оператор 'using', так как сам вводил ObjectContext в свой репозиторий. Итак, я добавил следующее в мой Application_EndRequest ().

ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();

Это работает, пока я не получаю доступ к моим частичным POCO. Я думаю, что StructureMap закрывает соединение, прежде чем мы перейдем к Частичному. У меня следующая ошибка.

Экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения.

Есть идеи, чтобы обойти это?

ОБНОВЛЕНИЕ - Вот трассировка стека

ObjectDisposedException: Экземпляр ObjectContext был распоряжаться и больше не может быть использован для операции, требующие подключения.] System.Data.Objects.ObjectContext.EnsureConnection () +8550458 System.Data.Objects.ObjectQuery 1.GetResults(Nullable 1 forMergeOption) + 46
System.Data.Objects.ObjectQuery 1.Execute(MergeOption mergeOption) +31<br> System.Data.Objects.DataClasses.EntityCollection 1.Load (List 1 collection, MergeOption mergeOption) +243 System.Data.Objects.DataClasses.EntityCollection 1.Load (MergeOption mergeOption) + 25
System.Data.Objects.DataClasses.RelatedEnd.Load () +37 System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad () +8032198 System.Data.Objects.Internal.LazyLoadBehavior.LoadProperty (TItem propertyValue, String отношениеName, строка targetRoleName, Boolean mustBeNull, Object wrapperObject) + 85
System.Data.Objects.Internal. <> C_ DisplayClass7 2.<GetInterceptorDelegate>b__1(TProxy proxy, TItem item) +101<br> 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<br> System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17<br> System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary 2 параметры) + 208
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod (ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary 2 parameters) +27<br> System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +55 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func 1 продолжение) +263 System.Web.Mvc. <> С
_DisplayClass17.b_ 14 () +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter (IActionFilter фильтр, ActionExecutingContext preContext, Func 1 continuation) +263 System.Web.Mvc.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14() +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func 1 продолжение) +263 System.Web.Mvc. <> С _DisplayClass17.b_ 14 () +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter (IActionFilter фильтр, ActionExecutingContext preContext, Func 1 continuation) +263 System.Web.Mvc.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14() +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func 1 продолжение) +263 System.Web.Mvc. <> С _DisplayClass17.b_ 14 () +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters (ControllerContext controllerContext, параметры IList 1 filters, ActionDescriptor actionDescriptor, IDictionary 2) + 191
System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String actionName) +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. <> С
_DisplayClassb.b_ 5 () +37 System.Web.Mvc.Async. <> C _DisplayClass1.b_ 0 () +21 System.Web.Mvc.Async. <> C _DisplayClass8 1.<BeginSynchronous>b__7(IAsyncResult _) +12 System.Web.Mvc.Async.WrappedAsyncResult 1.End () +62 System.Web.Mvc. <> C_ DisplayClasse.b _d () +50 System.Web.Mvc.SecurityUtil.b__0 (Действие е) + 7
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust (Action действие) + 22 * ​​1049 * 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 шаг, логическое и завершено синхронно) + 184

** ОБНОВЛЕНИЕ 2: Мой Application_EndRequest получает удар дважды. Что может вызвать это? **

STACK при первом попадании.

Nhs.Web.UI.DLL! Nhs.Web.UI.Global.Application_EndRequest (отправитель объекта = {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 completeSynchronously = 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, cb System.AsyncCallback, дополнительные данные объекта) + 0xad байт
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 (ecb System.IntPtr, int iWRType) + 0xfd байт
[Appdomain Transition]
[Родной для управляемого перехода]

STACK при втором ударе

Nhs.Web.UI.DLL! Nhs.Web.UI.Global.Application_EndRequest (отправитель объекта = {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 completeSynchronously = 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 (состояние объекта) + 0x2d байт mscorlib.dll! System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executeContext, 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 Transition]
[Родной для управляемого перехода]

1 Ответ

2 голосов
/ 17 февраля 2011

Попробуйте

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

Global.asax

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

StructureMap будет хранить контекст каждый раз, когда вы делаете доступ

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