- 接続プーリングは、他のADO.NETアプリケーションと同様に処理されます。エンティティ接続では、従来の接続文字列を使用した従来のデータベース接続が引き続き使用されます。使用したくない場合は、接続文字列の接続プールをオフにできると思います。(SQL Server接続プーリング(ADO.NET)の詳細を読む)
- グローバルコンテキストを使用しないでください。ObjectContextは、アイデンティティマップや作業単位などのいくつかのパターンを内部的に実装しています。グローバルコンテキストの使用による影響は、アプリケーションタイプごとに異なります。
- Webアプリケーションの場合、リクエストごとに単一のコンテキストを使用します。Webサービスの場合、呼び出しごとに単一のコンテキストを使用します。WinFormsまたはWPFアプリケーションでは、フォームごとまたはプレゼンターごとに単一のコンテキストを使用します。このアプローチを使用できない特別な要件がある場合がありますが、ほとんどの状況ではこれで十分です。
WPF / WinFormアプリケーションの単一オブジェクトコンテキストの影響を知りたい場合は、この記事を確認してください。それはNHibernateセッションについてですが、考え方は同じです。
編集:
EFを使用すると、デフォルトで、各エンティティはコンテキストごとに1回だけロードされます。最初のクエリはエンティティインスタンスを作成し、内部に保存します。同じキーを持つエンティティを必要とする後続のクエリは、この格納されたインスタンスを返します。データストアの値が変更された場合でも、最初のクエリからの値を持つエンティティを受け取ります。これはアイデンティティマップパターンと呼ばれます。オブジェクトコンテキストにエンティティを強制的に再読み込みさせることができますが、単一の共有インスタンスが再読み込みされます。
エンティティに加えられた変更はSaveChanges
、コンテキストを呼び出すまで保持されません。複数のエンティティを変更して、一度に保存できます。これは、作業単位パターンと呼ばれます。保存する変更された添付エンティティを選択して言うことはできません。
これらの2つのパターンを組み合わせると、興味深い効果が得られます。アプリケーション全体のエンティティのインスタンスは1つだけです。エンティティへの変更は、変更がまだ永続化(コミット)されていなくても、アプリケーション全体に影響します。ほとんどの場合、これはあなたが望むものではありません。WPFアプリケーションに編集フォームがあるとします。エンティティを操作していて、複雑な編集(値の変更、関連エンティティの追加、他の関連エンティティの削除など)をキャンセルすることにしました。ただし、エンティティは共有コンテキストですでに変更されています。あなたは何をしますか?ヒント:のCancelChangesやUndoChangesについては知りませんObjectContext
。
サーバーのシナリオについて説明する必要はないと思います。複数のHTTP要求またはWebサービス呼び出し間で単一のエンティティを共有するだけでは、アプリケーションは役に立たなくなります。どんなリクエストでもトリガーできるSaveChanges
間で単一の作業単位を共有しているため、、別のリクエストからの部分的なデータをして保存ます。これには別の問題もあります。コンテキストと、コンテキスト内のエンティティを使用した操作、またはコンテキストで使用されるデータベース接続はスレッドセーフではありません。
読み取り専用アプリケーションの場合でも、アプリケーションにクエリを実行するたびに新しいデータが必要になる可能性があるため、グローバルコンテキストは適切な選択ではありません。