2017-02-13 28 views
0

エントリを作成した後、ナビゲーションプロパティをロードする最もエレガントで/最良の方法を探しています。Eager loadingエンティティフレームワークのコア

状況は次のとおりです。 *私は自分のテーブルに行を作成し、他の2つのテーブルをIDでリンクします。私が返すオブジェクトには、実際にリンクされたオブジェクトではなく、IDのみが含まれています。

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

かの操作を行います。 *積極的なロードを通して、私は私がいないチェーン参照することができますので、私は完全なオブジェクトを照会可能性がどちらか、動作していないようなオブジェクト

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

をロードしたいです

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

しかし、これは1つの複合呼び出しではなく、2つの呼び出しをデータベースに作成します(疑いがあります)。あるいは、私はそれらの参照をチェーンする別の方法を逃していますか?あなたは、単純な匿名型の投影を使用してLoading Related Dataで説明したようにナビゲーションプロパティの修正アップに頼ることができ、この特定のシナリオでは

答えて

2

ヒントEntity Frameworkのコアは自動的に修正アップしますナビゲーションプロパティを
以前にコンテキストインスタンスにロードされた他のエンティティに送信します。したがって、ナビゲーションプロパティのデータを明示的にインクルードしなくても、関連エンティティの一部またはすべてが以前にロードされていた場合でも、プロパティにデータが格納されることがあります。

ので、次は仕事をするでしょう:

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

と理論的には(唯一の関連データをロードする必要があります)良いはずです。しかしながら、それはまた、このようInclude sの変異体のそれは等価なって、すべてのルート・オブジェクト・フィールドを含むことになる電流(V1.1.0)EFコアのバグ:

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

私が個人的にので、最初の方法を使用します将来のEFコアリリースではバグが修正されることが期待されていますが、2番目のメソッドの動作は「設計通り」です。

関連する問題