Я использовал 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]
[Родной для управляемого перехода]