[解決済み】Entity Frameworkのモデル定義でクラスプロパティに「virtual」を使用する理由は?
質問
ブログには、以下のコードサンプルが掲載されています。
public class Dinner
{
public int DinnerID { get; set; }
public string Title { get; set; }
public DateTime EventDate { get; set; }
public string Address { get; set; }
public string HostedBy { get; set; }
public virtual ICollection<RSVP> RSVPs { get; set; }
}
public class RSVP
{
public int RsvpID { get; set; }
public int DinnerID { get; set; }
public string AttendeeEmail { get; set; }
public virtual Dinner Dinner { get; set; }
}
を使用する目的は何ですか?
virtual
クラスでプロパティを定義するときは? また、どのような効果があるのでしょうか?
どのように解決するのですか?
Entity Framework が仮想プロパティの周りにプロキシを作成し、プロパティがレイジーローディングとより効率的な変更追跡をサポートできるようにします。参照 Entity Framework 4.1 POCO Code First で virtual キーワードはどのような効果があるのですか? を参照してください。
編集して、"create a proxy around"を明確にしました。
create a proxy around"というのは、特にEntity Frameworkが行うことについて言及しています。Entity Framework は、遅延ロードと効率的な変更追跡をサポートするために、ナビゲーションプロパティを仮想としてマークすることを要求します。参照
POCOプロキシを作成するための要件
.
Entity Frameworkは、この機能をサポートするために継承を使用します。そのため、ベースクラスのPOCOで特定のプロパティを仮想とマークする必要があります。それは文字通り、あなたのPOCO型から派生した新しい型を作成します。つまり、あなたのPOCOはEntity Frameworkが動的に作成するサブクラスの基本型として動作しているのです。それが私が"create a proxy around"で意味したことです。
Entity Frameworkが作成する動的に生成されるサブクラスは、静的なコンパイル時ではなく、実行時にEntity Frameworkを使用することで明らかになります。そして、Entity Frameworkの遅延ロードまたは変更追跡機能を有効にした場合のみです。Entity Framework の遅延ロードや変更追跡機能を使わないことを選択した場合 (これはデフォルトではありません)、ナビゲーションプロパティを仮想として宣言することは必要ありません。その場合、Entity Framework が "eager loading" と呼ぶものを使用するか、複数のデータベースクエリにわたって関連する型を手動で取得して、それらのナビゲーションプロパティを自分でロードする責任を負います。しかし、多くのシナリオで、ナビゲーションプロパティの遅延ロードと変更追跡機能を使用することができますし、使用する必要があります。
もし、あなたが独立したクラスを作成し、プロパティを仮想とマークし、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;
関連
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み] Entity Framework - 複数レベルのプロパティを含める
-
[解決済み】Entity Framework 4.1 Code Firstでクラスプロパティを無視する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】Entity Framework 4.1 POCO Code Firstでvirtualキーワードはどのような効果を持つことができますか?