Entity Frameworkコア - レイジーロード

c# entity-framework-core

質問

私のVisual Studiosのリクエストに耳を傾けて、私はEntity Framework Core(1.0.1)を使って最新のプロジェクトを始めました。

だから私はいつも '仮想'指定子を使ってリストの遅延読み込みを有効にしているので、データベースモデルを書いています。親テーブルをロードするとき、子リストは決してロードされないように見えます。

親モデル

public class Events
{
    [Key]

    public int EventID { get; set; }
    public string EventName { get; set; }
    public virtual List<EventInclusions> EventInclusions { get; set; }
}

子供モデル

public class EventInclusions
{
    [Key]
    public int EventIncSubID { get; set; }
    public string InclusionName { get; set; }
    public string InclusionDesc { get; set; }
    public Boolean InclusionActive { get; set; }

}

これらのテーブルに新しいレコードを追加することは、EventInclusionsレコードをイベントレコード内のリストとして入れ子にすることができて慣れているように思われます。

この表を照会すると

_context.Events.Where(e => e.EventName == "Test")

問題

EventInclusionsは、シーンの裏側のデータに関係なくnull値を返します。

少し読んだら、これは私が通常使っているEF6とEF Core

ブランケットLazy Loading文を書くか、レイジーローディングを指定するための新しいフォーマットを理解するのに役立つかもしれません。

カズ

受け入れられた回答

したがって、EFコアは現在、遅延ロードをサポートしていないようです。それが来るが、しばらく時間がかかるかもしれない。

今のところ誰かがこの問題に遭遇して苦労している場合。以下は、 Eagerローディングのデモです。これは、今のところあなたが使用しなければならないものです。

あなたが人物オブジェクトを持ち、そのオブジェクトが別のテーブルに帽子のリストを含む前に言ってください。

書くよりもむしろ

var person = _context.Person.Where(p=> p.id == id).ToList();

person.Hats.Where(h=> h.id == hat).ToList();

あなたは書く必要があります

var person = _context.Person.Include(p=> p.Hats).Where(p=> p.id == id).ToList();

そして、 person.Hats.Where(h=> h.id == hat).ToList();働くでしょう

あなたが複数のリストを持っているなら - チェーンを含む

var person = _context.Person.Include(p=> p.Hats).Include(p=> p.Tickets)
                            .Include(p=> p.Smiles).Where(p=> p.id == id).ToList();

私はちょっと、この方法がより安全であることを知っています。しかし、私は彼らがすぐにLazyを読み込むことを願っています!

カズ


人気のある回答

レイジーローディングがEF Core 2.1利用可能になりました。ここに関連するドキュメントへのリンクがあります:

https://docs.microsoft.com/en-us/ef/core/querying/related-data#lazy-loading



Related

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