2013-04-17 8 views
10

I顧客テーブルentityframework

var customers= context.CustomerEntities.Include("Addresses").Select(Mapper.Map).ToList(); 

マッパー関数からデータを取得し、次のコードは、ビジネスに、エンティティオブジェクトをマッピングしていオブジェクトであり、このように見えます。

internal static Customer Map(CustomerEntity entity) 
    { 
     if (entity == null) 
      return null; 

     return new Customer 
     { 
      Id = entity.Id, 
      Name = entity.Name, 
      Addresses = Map(entity.Addresses) 

     }; 
    } 

ここで、上記のコードはうまく動作します。しかし

、私はこれを行うにしてみてください。

var customers= context.CustomerEntities.Select(Mapper.Map).ToList(); 

は、私は、エラーメッセージが表示されます:マッパー関数が実行されているThere is already an open DataReader associated with this Command which must be closed first

この問題を解決するには、接続文字列にmultipleactiveresultsets=Trueを設定する必要があります。私はそれを試して、それは私の問題を解決しました。

しかし、SQLプロファイラを実行すると、エンティティフレームワークからすべての顧客にクエリを実行すると、必要のないすべてのアドレスも自動的に取得されました。

multipleactiveresultsets=Trueを設定する以外にも回避策がありますか?私はアドレスが常に怠惰に読み込まれることを望んでいません。

+0

ここでは例の前にコードをチェックしたいと思います。コードが実行される前に別のコンテキストがアクティブになっていると思います。 – Middas

+0

いいえ私は別のアクティブなコンテキストを持っていません –

+0

ダン、あなたは何かにいるかもしれません。私はそれを試してみましょう –

答えて

11

私はそれがそれぞれCustomerのために、selectステートメントがデータベースをもう一度読み込んで読み込む原因であると考えています。なぜあなたは最初ToList()をしないと、マッピングのような(Select)何か適用されます。私は、これが最初のデータを持参して、マッピングを行うだろうと信じて

var customers= context.CustomerEntities.ToList().Select(Mapper.Map); 

を、あなたはその問題を持っていないでしょう。

+12

大量のデータを扱っている場合は、あなたがそれを避けることができれば非常に悪い考えである全体のコレクションにメモリに具体化されます。 – Henry

+2

上記の理由によりダウンしました。 –

+2

貢献したい何かがある場合を除いて、無意味なダウン投票が可能です。 – JazziJeff