2011-01-10 22 views
8
using(DataContext db = new DataContext()) 
{ 
    var result = db.SomeTable.ToList(); 
    return result; 
} 

問題が返された後、接続が閉じられ、閉じられているため、子要素にアクセスしようとするとクラッシュします。これは、レイジーロードがTrue(デフォルト)に設定されているため、子リレーションが使用される前にロードされることはなく、接続が閉じられた後に子リレーションを使用し始めるからです。では、これを解決するにはどのように最善の方法がありますか?Entity Framework遅延読み込み

遅延読み込みを無効にしようとしましたが、子リレーションテーブルが読み込まれませんでした。

答えて

14

あなたは常に明示的にあなたの子供のコレクションをロードすることができます。

var result = db.SomeTable.Include("SomeChildCollectionName") 
         .Include("AnotherChildCollectionName") 
         .ToList(); 
+0

ですが、明示的にinclude( "ElementName")を書くことなくすべての子要素をロードしたいのですが?子要素がたくさんあります。その理由は – syncis

+0

@ user554978です。これはサポートされていません。 Includeを使用してすべての子を明示的にロードするか、接続を開いたままにしておき、Lazy Loadingがそれを実行できるようにする必要があります。 –

+0

ああ、ありがとう! – syncis

3

.include()メソッドを使用できます。

var result = db.SomeTable.Include("ChildEntitySet").ToList(); 

返信前にresult.ChildEntitySet.Load()コールを追加することもできます。これは、サーバーへの2回のトリップにつながるため、効率が低下します。 .Include()メソッドを使用すると、サーバーへのトリップを1回だけ許可するJOINを持つSQL文が生成されます。

+1

[OK]を私は明示的に(「のElementName」)を含む書き込みをすることなく、すべての子要素をロードしたい場合は何?子要素がたくさんあるのですが、それはなぜ – syncis

関連する問題