2016-08-05 14 views
2
自動的に関連するエンティティをロードしているのはなぜ

が、私は=Entity Frameworkのは

  1. ユーザー(ID、ユーザ名、メールアドレス、パスワード)
  2. USER_PROFILE(ID、UserID_FK、まず、最後、中東)
  3. のようなテーブルがあるとし
私たちはユーザーのテーブルからデータを取得しようとしていると我々は、我々は

db.Users.Include(x=>x.User_Profile).Where(z=>z.ID==1).ToList()を使用し、関連エンティティデータが必要な場合は、いくつかの実装を見てきました

しかし、私のプロジェクトで、私は

db.Users.Where(z=>z.ID==1).ToList()

を使用する場合でも、私はまだ関連のエンティティを取得することができています。なぜこれが起こるのですか?

+1

遅延読み込みが有効? –

+0

どうすればわかりますか? – kamalpreet

+3

あなたは 'Context.Configuration.LazyLoadingEnabled'のようなコンテキストの設定を通してそれをチェックすることができます。 'Context.Configuration.LazyLoadingEnabled = false;' –

答えて

2

あなたの質問に答えるには、EFでのLazy LoadingとEagerの読み込みの背後にある基本的な考え方を理解する必要があります。

熱心読み込ん:

積極的なロードは、エンティティのタイプのクエリは、クエリの一部として関連するエンティティをロードするプロセスです。 Eagerの読み込みは、Includeメソッドを使用して行います。たとえば、下のクエリ は、ID 1と彼のプロフィールを持つユーザーを読み込みます。

db.Users.Include(x=>x.User_Profile).Where(z=>z.ID==1).ToList() 

遅延読み込み:

遅延ロードエンティティのエンティティまたはコレクションが自動的にデータベースからエンティティ/エンティティを参照するプロパティにアクセスすることが初めてロードされるプロセスです。 POCOエンティティタイプを使用する場合、派生したプロキシタイプのインスタンスを作成し、仮想プロパティをオーバーライドしてロードフックを追加することにより、 遅延ロードを実現します。 たとえば、コードで定義されたUserエンティティクラスを使用する場合、Proflie/sナビゲーションプロパティに初めてアクセスするときに、関連するProfileがロードされます。記事のコレクションの

特定のナビゲーションプロパティの遅延ロードをオフに

  • レイジーローディングは、投稿プロパティが非仮想作ることによってオフにすることができます。

は、すべてのエンティティのための遅延ロードをオフにし

public class MyDbContext: DbContext 
{ 
    public MyDbContext:() 
    { 
     this.Configuration.LazyLoadingEnabled = false; 
    } 
} 

明示的なロード:

として明示的なロード定義される:オブジェクトはクエリによって返されたときに、関連するオブジェクトはありません同時にロードされます。デフォルトでは、ナビゲーションプロパティのLoadメソッドを使用して明示的に要求されるまでロードされません。

資源:

https://msdn.microsoft.com/en-us/data/jj574232.aspx

+0

これは、私たちがNavigationプロパティにアクセスしようとしないと、レコードがフェッチされないのですが、Lazy Loadingであることを意味します。 – kamalpreet

+0

@kamalpreet VSデバッガがアクセスしたときにVSデバッガがそれらをロードするときにも正しい。動的プロキシ(仮想プロキシ)は、クエリが終了するまで空のオブジェクトを配信できます。詳細情報:https://msdn.microsoft.com/en-us/data/jj592886.aspx –