Eager loading Entity frameworkコア

c# entity-framework-core

質問

エントリを作成した後にナビゲーションプロパティを読み込むための最もエレガントで最良の方法を探しています。

状況は次のとおりです。*自分のテーブルに行を作成し、他の2つのテーブルをIDでリンクします。返されたオブジェクトにはidのみが含まれており、実際にリンクされているオブジェクトは含まれていません。 *積極的なロードを通して、私はそれらのオブジェクトをロードしたいです。

context.Entry(b)
    .Reference(e => e.Table1)
    .Reference(e => e.Table2)
    .Load();

動作していないようです、私は参照を連鎖することはできませんので、私はどちらか完全なオブジェクトを照会することができます:

context
    .Objects
    .Where(o => o.ID == id)
    .Include(o => o.Table1)
    .Include(o => Table2)
    .FirstOrDefault();

またはこれを行います。

context.Entry(b)
    .Reference(e => e.Table1)
    .Load();

context.Entry(b)
    .Reference(e => e.Table2)
    .Load();

しかし、これは1つの複合呼び出しではなく2つのデータベースへの呼び出しを作成します(私は疑います)。それとも、これらの参照を連鎖させる別の方法が欠けていますか?

受け入れられた回答

この特定のシナリオでは、単純な匿名型投影法を使用し、 関連データのロードで説明されているようにナビゲーションプロパティの修正に依存することができます。

先端
Entity Framework Coreは、ナビゲーションプロパティを以前にコンテキストインスタンスにロードされた他のエンティティに自動的に修正します。そのため、ナビゲーションプロパティのデータを明示的に含めなくても、関連エンティティの一部または全部が以前にロードされている場合は、プロパティがまだ入力されている可能性があります。

それで、以下は仕事をします:

context.Objects
    .Where(o => o.ID == id)
    .Select(o => new { o.Table1, o.Table2 })
    .Load();

そして理論的にはより良いはずです(関連データだけをロードするべきです)。ただし、現在の(v1.1.0)EFコアのバグにより、すべてのルートオブジェクトフィールドも含まれるため、 Include sのバリアントと同等になりInclude

context.Objects
    .Where(o => o.ID == id)
    .Include(o => o.Table1)
    .Include(o => o.Table2)
    .Load();

私は個人的には最初の方法を使用するでしょう。というのは、将来のEF Coreリリースでバグが修正されることを期待しているからです。



Related

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