これにより、Entity Frameworkは仮想プロパティの周囲にプロキシを作成できるため、プロパティは遅延読み込みとより効率的な変更追跡をサポートできます。Entity Framework 4.1 POCO Code Firstで仮想キーワードがどのような効果を持つことができるかを参照してください?より徹底的な議論のために。
「プロキシを作成する」を明確にするために編集します。
「プロキシを作成する」とは、Entity Frameworkの機能を具体的に指していることを意味します。Entity Frameworkでは、遅延読み込みと効率的な変更追跡がサポートされるように、ナビゲーションプロパティを仮想としてマークする必要があります。POCOプロキシを作成するための要件を参照してください。
Entity Frameworkはこの機能をサポートするために継承を使用します。そのため、基本クラスのPOCOで特定のプロパティを仮想としてマークする必要があります。文字通り、POCOタイプから派生する新しいタイプを作成します。したがって、POCOはEntity Frameworkの動的に作成されたサブクラスの基本型として機能しています。それが「プロキシを作成する」という意味です。
Entity Frameworkが作成する動的に作成されたサブクラスは、静的コンパイル時ではなく実行時にEntity Frameworkを使用すると明らかになります。また、Entity Frameworkの遅延読み込みまたは変更追跡機能を有効にした場合のみ。Entity Frameworkの遅延読み込みまたは変更追跡機能を使用しないことを選択した場合(これはデフォルトではありません)、ナビゲーションプロパティを仮想として宣言する必要はありません。次に、Entity Frameworkが「イーガーロード」と呼ぶものを使用するか、複数のデータベースクエリから関連するタイプを手動で取得するかのいずれかで、これらのナビゲーションプロパティを自分でロードする必要があります。ただし、多くのシナリオでは、ナビゲーションプロパティに遅延読み込み機能と変更追跡機能を使用できます。
スタンドアロンクラスを作成し、プロパティを仮想としてマークし、独自のアプリケーションでそれらのクラスのインスタンスを作成して使用する場合、完全にエンティティフレームワークのスコープ外では、仮想プロパティは何も得ません。自分の。
プロパティを仮想としてマークする理由を説明するために編集します
次のようなプロパティ:
public ICollection<RSVP> RSVPs { get; set; }
フィールドではなく、そのように考えるべきではありません。これらはゲッターおよびセッターと呼ばれ、コンパイル時にメソッドに変換されます。
//Internally the code looks more like this:
public ICollection<RSVP> get_RSVPs()
{
return _RSVPs;
}
public void set_RSVPs(RSVP value)
{
_RSVPs = value;
}
private RSVP _RSVPs;
これが、Entity Frameworkで使用するために仮想としてマークされている理由です。これにより、動的に作成されたクラスが内部で生成さget
れたset
関数と関数をオーバーライドできます。Entity Frameworkの使用法でナビゲーションプロパティのゲッター/セッターが機能している場合は、プロパティのみに変更して再コンパイルし、Entity Frameworkが引き続き適切に機能するかどうかを確認してください。
public virtual ICollection<RSVP> RSVPs;