問題タブ [objectcontext]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
architecture - データ アクセス層での HttpContext.Current へのアクセス
レイヤード アーキテクチャの Entity Framework での私の質問に対する回答に基づいて、リポジトリ (ビジネス ロジックではなく CRUD 抽象化のみを担当) を DAL に移動し、ビジネス ロジック用に BLL を予約します。
エンティティ コンテキストは作業単位と見なす必要があるため、再利用すべきではないという結論に達しました。したがって、リポジトリで HttpContext ごとに obejctcontext を作成して、パフォーマンス/スレッドの [un]safe 問題を回避したいと考えています。次のように、リポジトリで objectcontext を定義したいと思います。
その場合、DAL プロジェクトは HttpContext.Current 変数を認識する必要があります。これが良い習慣かどうかはわかりませんが、あなたの意見を知りたいです。
asp.net - 依存性注入を使用した Entity Framework ObjectContext
さて、私は自分のアプリケーション構造に行き詰まっているようです。これが私がやりたいことです:
- UI レイヤー: ASP.NET Web フォーム Web サイト。
- BLL: DAL 上のリポジトリを呼び出すビジネス ロジック層。
- DAL: .EDMX ファイル (エンティティ モデル) と、各エンティティの CRUD 操作を抽象化するリポジトリ クラスを含む ObjectContext。
- エンティティ: POCO エンティティ。持続性無知。Microsoft の ADO.Net POCO Entity Generator によって生成されます。
リポジトリで HttpContext ごとに obejctcontext を作成して、パフォーマンス/スレッドの安全性の問題を回避したいと考えています。理想的には、次のようになります。
問題は、DAL (リポジトリが配置されている場所) で HttpContext にアクセスしたくないことです。しかし、どうにかして HttpContext を DAL に渡す必要があります。ここでの私の質問への回答に基づいて、IoC パターンを使用する必要があります。理想的には、多層アーキテクチャで このようなことを達成したいと考えています。
私は Autofac をチェックアウトしましたが、非常に有望なようです。しかし、多層アーキテクチャでこれをどのように達成できるかわかりません (Httpcontext を渡して、HttpContext ごとに 1 つの ObjectContext がインスタンス化されるようにする)。これを達成する方法について、誰かが私にいくつかの実例を教えてもらえますか? DAL の HttpContext に直接アクセスせずに、DAL の HttpContext を認識するにはどうすればよいですか? 多層ソリューションの設計に少し戸惑っているように感じます。
asp.net - Entity Framework Context.Refreshバグの回避策?
EF4と自己参照テーブル(隣接リスト階層の実装)を使用してこの問題に遭遇しました。
注:多対多の参照ではなく、単一のテーブルでの1対多の参照です。EF4の明らかなバグが原因で、失敗を使用して断続的な( " ... ObjectContextが一貫性のない状態になっている可能性があります... ")を
解決しようとします。InvalidOperationException
Context.Refresh
前述の投稿で、Shimmyのconnect.microsoft.comリンクをたどると、バグがまだ残っていることがわかりました。
誰かが回避策をお勧めできますか?
データベースとEntityFrameworkが同期しなくなった場合はどうしますか?
役立つかもしれないいくつかのより多くの事実を編集してください:
- を取得し、「データベースへの変更は正常にコミットされました...」
InvalidOperationException
というメッセージが表示された場合、それは正しくありません。彼らはそうではありませんでした。オブジェクトのを1からnull(タイプ)に変更しようとしました。ParentId
ParentId
int?
- オブジェクトの
ParentId
属性が期待値(null)に正しく変更されました。と呼びますContext.SaveChanges()
。次に、例外がスローされます。DBを確認しましたが、値が更新されていません。この場合、ParentId
はデータベース内でまだ1です。 - の内部で
catch
、を介してオブジェクトを再クエリしようとしても、オブジェクト
myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
は
同じParentId
ままです。(誤った)データベース値によって更新されません!
さて、それは奇妙に思えますが、もう一度保存すると、データベースが修正される可能性があります。 Context.SaveChanges()
Stillの内部から後続を呼び出してcatch
も、データベースは更新されません。(ただし、今回は例外はスローされません。)- SetParentメソッドを新たに呼び出すと
myObj = Context.MyObjects.SingleOrDefault(o => o.Id == id)
、
オブジェクトのParentId
パラメータがデータベースの値である1に正しく設定されます。
さらに、笑い声の場合、ParentId
親がないことを示すために、オブジェクトのIDをnullではなく独自のIDに設定しました。これは正常に機能し、を引き起こしませんでしたInvalidOperationException
。しかし、それは他の理由でPITAです。たとえば、オブジェクトはそれ自体が追加の子であると報告します。
したがって、質問は次のとおりです。
- 自己参照
int? ParentId
をnullに設定しようとすると、例外が発生します。 - 例外の前にデータベースが更新されないのはなぜですか?
- そして、なぜ、内部で
catch
、再同期できないのですか?!
nhibernate - EF4ObjectContextとNHibernateセッション
EF4に飛び込んだ後、NHibernateを学ぼうとしています。EF4 ObjectContext(またはDbContext)と同等のNHibernateセッションですか?
具体的には、EF4では、ObjectContext(またはDbContext)から派生し、クラスには各エンティティの明示的なObjectSetが含まれています(例:
これまで見てきたNHibの例では、Sessionオブジェクトはこのように使用されていません。私は何かが足りないのですか?
multithreading - Silverlight 4 Ria サービスと複数のスレッド
クライアントの接続を維持するのに時間がかかりすぎる非常に長時間実行されるクエリがあります。DomainService を呼び出し、新しいワーカー スレッドを作成し、サービスから戻って、クライアントがポーリングを開始して長時間実行されているクエリが完了したかどうかを確認したいと考えています。
私が直面している問題は、呼び出し元のスレッドがすぐに終了するため、元のスレッドが終了すると ObjectContext が破棄されるため、ワーカーがエンティティにアクセスしようとすると例外がスローされることです。
新しいコンテキストを作成し、Silverlight クライアントから呼び出す方法は次のとおりです。
サーバーでの入力方法:
新しいスレッドで呼び出される WorkerProc メソッドを次に示します。query1 オブジェクトを反復処理しようとするとすぐに、ObjectContext already Disposed 例外が発生します。
どうすればこれを防ぐことができますか? 新しいスレッドの新しいコンテキストを作成する方法はありますか? 私は本当にこれにこだわっています。
ありがとう。
entity-framework-4 - Anthoer ObjectContext から切り離されたエンティティ オブジェクトをアタッチするためのベスト プラクティスは何ですか?
タイトルで述べたように、利用可能なメソッドはいくつありますか?
1 つの ObjectContext からエンティティ オブジェクトを取得し、エンティティ オブジェクトを OjbectContext オブジェクトから切り離して返します。
後で、このオブジェクトに変更を加えて、その変更をデータベースに保存したいとします。このように書くべきだと思いますよね?(まあ、これは私にとってはうまくいきます。)
また
この方法は私にも有効です。
最初の方法では、SQL ステートメントを生成して Url テーブルのすべての列を更新しますが、2 番目の方法では、"UrlString" 列のみを更新する SQL スクリプトを提供します。
両方とも、データベースから一時エンティティ オブジェクトを取得する必要があります。これは、上記のコードの 't' です。
この目的を達成するための他の方法はありますか? または、それについて知っている他のより良い方法はありますか?または、このトピックに関する公式の解決策はありますか?
どうもありがとう。
exception - EF4: トリガーを使用してビューに挿入すると、ObjectContext が矛盾する
ADO.NET Entity Framework 4 を使用する SQL Server で、"代わりに" トリガーを使用するビューにレコードを挿入すると、無効な操作の例外が発生します。エラー メッセージには次のように表示されます。
{"データベースへの変更は正常にコミットされましたが、オブジェクト コンテキストの更新中にエラーが発生しました。ObjectContext が矛盾した状態にある可能性があります。内部例外メッセージ: EntityKey を定義するキーと値のペアを null または空にすることはできません。パラメータ名前: レコード"}
この単純化された例では、Contacts と Employers という 2 つのテーブルと、これら 2 つのテーブルに対して行を一度に挿入または取得できる Contacts_x_Employers ビューを 1 つ作成しました。テーブルには Name 属性と ID 属性のみがあり、ビューは両方の結合に基づいています。
そして、このトリガーがあります:
.NET コードは次のとおりです。
using (var Context = new TriggersTestEntities()) { Contacts_x_Employers CE1 = new Contacts_x_Employers(); CE1.ContactName = "J"; CE1.EmployerName = "T"; Contacts_x_Employers CE2 = 新しい Contacts_x_Employers(); CE1.ContactName = "W"; CE1.EmployerName = "C"; Context.Contacts_x_Employers.AddObject(CE1); Context.Contacts_x_Employers.AddObject(CE2); Context.SaveChanges(); // エラーのある行 }
</p>
SSDL および CSDL (ビュー ノード):
アプリケーション全体を再作成するための Visual Studio ソリューションと SQL スクリプトは、ftp://JulioSantos.com/files/TriggerBug/ の TestViewTrggers.zip にあります。提供できる支援に感謝します。私はすでにこの問題に何日も費やしました。
entity-framework-4 - StructureMap の使用中に ObjectContext を解放する
StructureMap を使用して、遅延ロードされた POCO クラスと共に ObjectContext (エンティティ) をリポジトリに挿入しています。これが私の Structuremap 登録です。
EDMX スキーマで定義されていない情報を取得するために、POCO クラスに対して部分クラスを定義しました。たとえば、Community.FloorPlanImages は、使用可能なすべてのイメージからフロア プラン イメージのみをフィルタリングするゲッターになります。クエリの最適化を開始するまでは、かなりうまくいきました。EFProf を使用すると、接続が閉じられていないことがわかりました。ObjectContext 自体をリポジトリに挿入しているため、「using」ステートメントを使用できませんでした。そこで、Application_EndRequest() に以下を追加しました。
部分 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.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.EntityCollection
2.<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) +27
c_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, 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, Func
1 継続) +263 System.Web.Mvc.<>c _DisplayClass17.b_14() +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext、IList1 filters, ActionDescriptor actionDescriptor, IDictionary
2 パラメーター) +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.WrappedAsyncResult
1.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 バイト
[管理された遷移にネイティブ]
[アプリドメインの遷移]
[管理された遷移にネイティブ]
c# - C#/ EFとリポジトリパターン:複数のリポジトリを持つソリューションのどこにObjectContextを配置しますか?
アプリケーションに複数のリポジトリがあります。ObjectContextはどこに置くべきですか?現在、私はObjectContext ctx;
すべてのリポジトリのようなリファレンスを持っています。これを実行するための最も賢明で安全な方法は何ですか?
model-view-controller - Entity Framework 4 コンテキスト?
私は、EF4 を使用するときにコンテキストを管理するために他の人が何をしているのかについてのフィードバックを探していました。Unit of Work、Service Layer、Repository、EF4 w/POCOテクニックを使用して(私は思う:))、MVCアプリを作成しています。
私のコントローラーは、UOWを取るサービスを利用し、リポジトリを利用してEFからPOCOを取得します。
これは正しく実装されていますか?
以下をご覧ください。フィードバックをお待ちしております!!
コントローラ
作業単位
サービス
リポジトリ