StructureMap を使用して、遅延ロードされた POCO クラスと共に ObjectContext (エンティティ) をリポジトリに挿入しています。これが私の Structuremap 登録です。
For<WebEntities>().LifecycleIs(new HybridLifecycle()).Use(()=>new WebEntities());
EDMX スキーマで定義されていない情報を取得するために、POCO クラスに対して部分クラスを定義しました。たとえば、Community.FloorPlanImages は、使用可能なすべてのイメージからフロア プラン イメージのみをフィルタリングするゲッターになります。クエリの最適化を開始するまでは、かなりうまくいきました。EFProf を使用すると、接続が閉じられていないことがわかりました。ObjectContext 自体をリポジトリに挿入しているため、「using」ステートメントを使用できませんでした。そこで、Application_EndRequest() に以下を追加しました。
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
部分 POCO で何もアクセスしない限り、これも機能します。パーシャルに到達する前に、StructureMap が接続を閉じていると思います。次のエラーが表示されます。
ObjectContext インスタンスは破棄されており、接続を必要とする操作には使用できなくなりました。
これを回避するためのアイデアはありますか?
更新 - ここにスタック トレースがあります
ObjectDisposedException: ObjectContext インスタンスが破棄され、接続を必要とする操作に使用できなくなりました。] System.Data.Objects.ObjectContext.EnsureConnection() +8550458 System.Data.Objects.ObjectQuery
1.GetResults(Nullable1 forMergeOption) +46
System.Data .Objects.ObjectQuery 1.Load(List 1.Load(MergeOption mergeOption) +25 System.Data.Objects.DataClasses.RelatedEnd.Load() +37 System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad() +8032198 システム。 Data.Objects.Internal.LazyLoadBehavior.LoadProperty(TItem propertyValue, String relationshipName, String targetRoleName, Boolean mustBeNull, Object wrapperObject) +85 System.Data.Objects.Internal.<>c_ DisplayClass7 2 つのパラメーター) +2081.Execute(MergeOption mergeOption) +31
System.Data.Objects.DataClasses.EntityCollection1 collection, MergeOption mergeOption) +243 System.Data.Objects.DataClasses.EntityCollection2.<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
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary 1 継続) +263 System.Web.Mvc.<>2 parameters) +27c_DisplayClass17.b_14 () +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter(IActionFilter) filter, 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 controllerContext、文字列 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.< >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 システム。 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 ステップ, Boolean& completedSynchronously) +184
**更新 2: Application_EndRequest が 2 回ヒットしています。それが起こる原因は何ですか?**
初段ヒットでスタック。
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 ステップ = {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 コンテキスト、System.AsyncCallback cb、オブジェクト extraData) + 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(System.IntPtr ecb, int iWRType) + 0xfd バイト
[Appdomain 遷移]
[マネージド遷移へのネイティブ]
2段目でスタック
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 ステップ = {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(objectエラー) + 0x1e バイト
mscorlib.dll!System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(オブジェクトの状態) + 0x2d バイト+ 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 バイト
[管理された遷移にネイティブ]
[アプリドメインの遷移]
[管理された遷移にネイティブ]