-1

コンテキストの作成時に熱心な読み込みを設定する場合Include、EF での使用の多くの例は次のようになります (Resources と Variations という 2 つの関連エンティティがあるとします)。

var context = new MyContext();
context.Resources.Include(x => x.Variations).First();
return context;

しかし、他の人はしません:

context.Resources.Include(x => x.Variations);

前者だけがうまくいくように見えますが、なぜそれが必要なのかについての説明が見つかりませんか?

4

3 に答える 3

2
context.Resources.Include(x => x.Variations);

実行時にすべてのリソースとそのバリエーションをロードするクエリを作成します。その後、そのクエリを破棄します。クエリを実行しないということは、クエリの結果が得られないことを意味し、そのクエリを実行することによる副作用もありません。

リソースで何かを行うことができます:

foreach (var resource in context.Resources.Include(x => x.Variations))
{
    /* ... */
}

または、コンテキストにオブジェクトを表示するだけの場合は、

using System.Data.Entity;

context.Resources.Include(x => x.Variations).Load();

私の知る限り、コンテキストを設定して.Include、クエリの作成時に常に暗黙的に の効果が実行されるようにする方法はありません。各クエリに含める必要があります。

于 2013-01-03T15:30:51.637 に答える
0

あなたがするとき

context.Resources.Include(x => x.Variations);

Resourceオブジェクトのリストを取得します。を使用.First()すると、そのリソースのリストの最初のリソースが得られます。

于 2013-01-03T12:47:32.597 に答える
0

つまり、さまざまなエンティティの読み込みの効果と呼ばれます。Entity Frameworkには、3つの要素があります。怠惰で、明示的で、熱心にロードするアプローチから選択し、それに応じてコードで使用します。

言い換えると、Entity Frameworkは、関連するエンティティを読み込む3つの方法をサポートしています。

  • 熱心な読み込み
  • 遅延読み込み
  • 明示的な読み込み

上記の3つの手法については、この記事「関連エンティティの読み込み」で詳しく説明しています。

以下のコードフラグメントは、熱心にロードを使用しています。

context.Resources.Include(x => x.Variations).First();

前者だけが私のために働くように見えます、しかし私はそれがなぜ必要であるかについての説明を見つけることができませんか?

関連するエンティティの読み込みは、積極的な読み込み(上記の関連するエンティティの積極的な読み込みを参照)またはLoadメソッド.First()を使用して実行できるため、後のコードフラグメント(のないもの)は機能しません。

context.Resources.Include(x => x.Variations).Load();
// or a sample like
// Load the posts related to a given blog
context.Entry(blog).Collection(p => p.Posts).Load();

編集:何らかの理由で遅延読み込みと混同された場合は、このオプションを使用して、コンテキストでそれをオフにすることができます。

public MyContext()
    {
        this.Configuration.LazyLoadingEnabled = false;
    }
于 2013-01-03T12:48:01.277 に答える