2016-07-19 4 views
0

(7)私は、次のエンティティがありますEntity Frameworkクエリは、子プロパティを別の変数にロードしています。どうして? Entity Frameworkのコアを用いた

public class Person { 
    public Int32 Id { get; set; } 
    public virtual Address Address { get; set; } 
} 

public class Address { 
    public Int32 PersonId { get; set; } 
    public String City { get; set; } 
} 

をそれから私は、2行目にブレークポイントでは、次のクエリを実行しました。

List<Context.Person> a = context.Persons.ToList(); 

List<Context.Person> b = context.Persons.Include(x => x.Address).ToList(); 

私は、変数をチェックする「」各リスト項目内のアドレスは、私が最初のクエリでアドレスを含めておりませんので、理にかなっているnullです。

次に、2番目のクエリを実行することができます。「b」リスト項目のアドレスには、nullとは異なるアドレスが含まれていることがわかります。

"b"を実行した後、 "a"項目のアドレスが読み込まれるということは奇妙です。

なぜですか?これを避けることはできますか?

私はいくつかのテストを作成していますが、これは避けたい動作です。

+0

問題は、住所が含まとして、あなたのコンテキストが大きくなっているあるので、a.Addressプロパティは、同様に満たされています。別のコンテキストでアドレスを追加してみてください - 遅延ロードを無効にすると、おそらく役に立ちます – DevilSuichiro

+0

遅延読み込みはEntity Frameworkコアには存在しません... 2つのコンテキストを使用せずにこれを解決する他の方法はありますか?私のリストには8つのレコードしかなく、それぞれ1つのアドレスしかありません。私はこれをやっていることが奇妙だと分かっています... –

答えて

1

なぜですか?エンティティタイプを返すため、デフォルトのクエリによって

は、あなたのケースでPersonオブジェクトのインスタンスが同じ文脈による2回の呼び出しの間で共有されていることを意味する、Tracking queriesをしています。また、それらが参照型であるため、後のクエリによるロードされた情報も前のクエリの結果で表示されます。

これを避けることはできますか?

あなたはNo-tracking queriesを使用することができます。

var a = context.Persons.AsNoTracking().ToList(); 
関連する問題