エンティティの大規模なコレクションの値を次々と再計算する必要があります。
そのプロセス中に、すべての自己追跡エンティティが同じ ObjectContext 内で変更されます。処理が必要なエンティティごとに、少量のデータをデータベースから取得する必要があります。その結果、多くの同じ SQL クエリが作成されますが、異なるパラメーターが使用されます。
Solutions Design の ORM Profilerソフトウェアを使用して、データベースに送信されるクエリをプロファイリングしています。
クエリ自体は私には問題ないようです。それらは短く、実行にそれほど時間はかかりません。
ただし、プロファイラーがクエリが実際にどのように処理されるかをどのように表示するかについて混乱しています。
ご覧のとおり、同じデータベース接続を開いたり閉じたりし続けます。
ここで、1 つの Open/Query/Close 接続の時間を見てみましょう。
データベース接続を開いたり閉じたりすると時間が無駄になるようです。
この回答を読んだ後、コードを変更したので、次のようになりました。
using (var connection = new EntityConnection(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString))
{
using (var context = new MyEntities(connection))
{
// ...
まだ同じ接続を使用していることがわかります (これは良いことです) が、接続はクエリ間で閉じたり開いたりし続けます。
Gert Arnoldは、コンテキストを使用する前に明示的に接続を開くことを提案しました。次に、コードを次のように変更しました。
using (var connection = new EntityConnection(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString))
{
connection.Open();
using (var context = new MyEntities(connection))
{
// ...
今それは動作します!すべてのクエリが同じデータベース接続に送信されます。
コンテキストを使用する前に接続を開く必要があるのはなぜですか?