2012-02-08 3 views
1

私は、仮想キーワードを使用してエンティティフレームワークに子テーブルがLAZYの方法でロードされるように指示できることを知っています。今単純なエンティティプロパティをEntity Frameworkのバーチャルとしてマークする利点はありますかCodeFirst 4.1

public class Person 
{ 
    public virtual string Name { get; set; } 
    public virtual int Age { get; set; } 
    public virtual History PastHistory { get; set; } 
    public virtual ICollection<Blog> Blogs { get;set; } 
} 

public class Blog 
{ 
    ..... blah.. blah.... blah 
} 

public class History 
{ 
    .... blah blah blah 
} 

、私の質問、履歴として

  1. はコレクションではなく、1、よう:私は歴史怠惰な方法をロードしたい場合は、別のエンティティの1つのマッピング、私は仮想としての歴史をマークする必要があります?

  2. 単純なプロパティ(名前:文字列、年齢:int)を仮想としてマークするメリットはありますか?現時点では、明らかな理由がなくても、すべての簡単なプロパティを仮想としてマークしました。誰かが私にEFコードファーストでバーチャルが全く影響を与えないという単純な特性をマークしていることを確認したら、マークを削除して私のPOCOをより鮮明に見せます。

ありがとう。

答えて

4
  1. ヒストリがまだ関連エンティティ(別のテーブルのレコード)である場合、レイジーローディングを有効にするには、これをバーチャルにする必要があります。ブログで遅延読み込みを使用する場合は、エンティティ内の他のすべてのナビゲーションプロパティも仮想でなければなりません。
  2. すべての単純なプロパティバーチャルにマークを付けると、EFは動的な変更追跡を使用できます。

遅延ローディングと変更の両方の追跡は、実行時に作成され、エンティティタイプから派生したタイプの動的プロキシによって実行されます。 Virtualキーワードは、この派生型が、プロパティプロパティのコードを遅延ロードするか、単純プロパティの変更についてEFコンテキストに通知する新しいコードにプロパティコードをオーバーライド(ラップ)するために必要です。

関連する問題