ナビゲーションプロパティは仮想でなければならない - ef coreでは必須ではない?

c# entity-framework entity-framework-core navigation-properties virtual

質問

私はEFのナビゲーションプロパティで覚えているように仮想する必要があります

public class Blog 
{  
    public int BlogId { get; set; }  
    public string Name { get; set; }  
    public string Url { get; set; }  
    public string Tags { get; set; }  

    public virtual ICollection<Post> Posts { get; set; }  
}

しかし、私はEF Coreを見て、それを仮想として見ません:

public class Student
    {
        public int ID { get; set; }
        public string LastName { get; set; }
        public string FirstMidName { get; set; }
        public DateTime EnrollmentDate { get; set; }

        public ICollection<Enrollment> Enrollments { get; set; }
    }

もう必要ないのですか?

受け入れられた回答

EFではvirtual必須ではありませんでした。遅延読み込みのサポートが必要な場合にのみ必要でした。

Lazy読み込みはEF Coreではまだサポートされていないので 、現在virtualは特別な意味はありません。それが遅延ローディングサポートを追加する時(そしてもしそうなら)です(そうする計画があります)。

更新: EF Core 2.1から、 Lazy読み込みがサポートされるようになりました。しかし、 Microsoft.EntityFrameworkCore.Proxiesパッケージを追加せずにUseLazyLoadingProxies使用して有効にすると、元の答えがそのまま適用されます。

ただし、そうした場合、初期の実装ではオプトインコントロールがないために状況が大きく変わります - ナビゲーションプロパティ すべて virtualである必要が あります。これは私には意味がありません、あなたはそれが修正されるまでそれを使用しない方がいいです。あなたが本当に遅延読み込みを本当に必要とするならば、代わりのプロキシ読み込みなしの遅延読み込みを使ってください、その場合もまたvirtualは問題ではありません。


人気のある回答

受け入れられた答えが書かれてから事が変わった。 2018年に、 Lazy LoadingはEntity Framework Core 2.1の2つの異なるアプローチでサポートされるようになりました

2つの方法のより単純な方法は、プロキシを使用することです。これは、 virtualで定義されるために遅延読み込みが望まれるプロパティを必要としvirtual 。リンク先のページから引用するには:

レイジーローディングを使用する最も簡単な方法は、Microsoft.EntityFrameworkCore.Proxiesパッケージをインストールし、 UseLazyLoadingProxies呼び出すことで有効にすることUseLazyLoadingProxies 。 [...] EF Coreは、オーバーライド可能なすべてのナビゲーションプロパティ(つまり仮想から継承可能なクラス)で遅延ロードを有効にします。

提供されるサンプルコードは次のとおりです。

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Post> Posts { get; set; }
}

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public virtual Blog Blog { get; set; }
}

ILazyLoaderをデータ型のコンストラクタに挿入するプロキシなしでLazy Loadingを実行する別の方法があります。 これについてはここで説明します

要するに、遅延ロードを実行するには、プロキシを使用する方法と使用しない方法の2通りがあります。プロキシでLazy Loadingをサポートしたい場合にのみ、 virtual必要です 。それ以外の場合は、そうではありません。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ