web-dev-qa-db-ja.com

コードファースト仮想プロパティについて

こんにちは、Entity Framework Code Firstで作業することを学んでいるだけで、何かを理解できないようです。チュートリアルに基づいて3つのモデルを作成しました。

public class Course
{
    public int CourseID { get; set; }
    public string Title { get; set; }
    public int Credits { get; set; }
    public virtual ICollection<Enrollment> Enrollments{ get; set; }
}

public class Enrollment
{
    public int EnrollmentID { get; set; }
    public int CourseID { get; set; }
    public int StudentID { get; set; }
    public decimal? Grade { get; set; }
    public virtual Course Course { get; set; }
    public virtual Student Student { get; set; }
}
public class Student
{
    public int StudentID { get; set; }
    public string LastName { get; set; }
    public string FirstMidName { get; set; }
    public DateTime EnrollmentDate { get; set; }
    public virtual ICollection<Enrollment> Enrollments { get; set; }
}

私の問題は、仮想のプロパティが何をしているのか理解していないことです。データベースをチェックすると、各プロパティの列クレートはなく、他のプロパティのみです。

では、virtualキーワードを使用してプロパティを作成するとどうなりますか?

27
aleczandru

lazy loadingおよびchange trackingの管理に使用されます。

EFはランタイムにプロキシタイプを生成します。これは動的に生成されるタイプで、POCOクラスから継承するであり、遅延ロードを管理するためにすべてのEFスタッフを追加しますオーバーライドされた仮想プロパティで追跡を変更します=。

したがって、ここではvirtualは「魔法のキーワード」ではありません。virtualはここにあるため、POCOは実行時に追加のEF関連コードで継承できます。

37
ken2k

遅延読み込みを可能にする仮想プロパティがあります

6
gregjer

Virtualキーワードでマークされたプロパティまたはメソッドを作成すると、派生クラスでそれをオーバーライドできるため、作成したオブジェクトに応じて、メソッドにさらに特殊な動作を提供できます。

Entity Frameworkの場合、遅延読み込み動作が使用されることを指摘する規則もあります。この問題に関する質問はここにあります: Entity Framework 4.1仮想プロパティ

3
Freeman