6

次のエンティティ モデルを検討してください。

public class Parent
{
    public virtual FirstChild FirstChild { get; set; }
    public virtual SecondChild SecondChild { get; set; }
}

私のコードでは、Parentエンティティをロードしました:

Parent parent = <loaded in some way>;

ナビゲーション プロパティを明示的に読み込むには、次を使用します。

db.Entry(parent).Reference(p => p.FirstChild).Load();
db.Entry(parent).Reference(p => p.SecondChild).Load();

ただし、これにより 2 つの DB クエリが発生します。

質問: 単一のクエリで複数のナビゲーション プロパティを明示的にロードできる、より洗練された方法はありますか?

ロードしていない場合はparent、熱心なロードを行います。

Parent parent = db.Parents
    .Include(p => p.FirstChild)
    .Include(p => p.SecondChild)
    .FirstOrDefault();

しかし、前述したように、関連するエンティティなしで既に読み込まれています (読み込みコードを変更することはできません)。

4

1 に答える 1

1

唯一の可能な方法(私の知る限り)は、親プロパティをリロードすることです。変数parentがコンテキストにアタッチされていると仮定します。

var tmp = db.Parents
    .Include(p => p.FirstChild)
    .Include(p => p.SecondChild)
    .FirstOrDefault(p => p.Equals(parent));

// tmp and parent are the same instance now!
var isTrue = ReferenceEquals(tmp, parent);

var child1 = parent.FirstChild;  // is already loaded
var child2 = parent.SecondChild; // is already loaded

コンテキストは、探しているエンティティが既にロードおよびアタッチされていることを検出し、新しいものを作成せずに古いものを更新するため (parentこの場合)、これは機能します。

于 2016-11-21T16:44:59.487 に答える