EntityConnectionの有効期間を管理する

.net asp.net c# entityconnection entity-framework

質問

EntityContextの寿命を管理することについては多くの疑問がありました、

例えばLINQからエンティティへのコンテキストのインスタンス化

私は、エンティティコンテキストは作業単位と見なされ、したがって再利用されるべきではないという結論に至りました。すばらしいです。

しかし、データベースへのアクセスを高速化するための調査をしているうちに、このブログ記事に遭遇しました。

Entity Frameworkのパフォーマンスの向上

この記事では、他のフレームワークと比較してEFのパフォーマンスが低いのは、新しいEntityContextオブジェクトが必要になるたびにEntityConnectionオブジェクトが作成されることが原因であると主張しています。

これをテストするために、 Global.asax.csの Application_Start()に静的なEntityConnectionを手動で作成しました。

それから私は文を使って私の全ての文脈

using( MyObjContext currContext = new MyObjeContext(globalStaticEFConnection)
{
   ....
}

私が言うことができる限りこれは少しもエラーなしで物事をスピードアップしたようです。

しかし、これは安全ですか?

アプリケーション全体の静的EntityConnectionを使用すると競合状態が発生しますか?

よろしく、Kervin

受け入れられた回答

EntityConnectionはスレッドセーフではないと文書化されています 。それらをプールすることは可能だと思いますが、Webアプリケーションに単一の静的接続を使用することはできません。多くのスレッドが関与するためです。


人気のある回答

  • EFコンテキストがアプリケーション全体の場合、ユーザーAが変更を加え(コミットしていない)、ユーザーBが自分の変更をコミットしたとします。両方のユーザーAとBが同じインスタンスを使用するため、すべての変更はデータベースにコミットされます。

  • 私のプロジェクトでは、WebRequestごとにEFコンテキストのインスタンスを作成しました。コンテキストオブジェクトはWebリクエストの最初から最後まで静的であり、そのリクエスト内のすべての操作は同じEFコンテキストで動作します。これにより、上記の問題がなくても処理が大幅にスピードアップしました。

これを実装する1つの方法は、EFコンテキストの存続期間を管理するためにDIコンテナー(私はUnityを使用しています)を使用することです。 Webリクエストごとの有効期間マネージャはUnityではそのままでは与えられませんが、これがどのように行われることができるかを示す記事がたくさんあります。

HTH



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ