Explicit loading of multiple references/collection

2019-06-25 05:24发布

Consider following entity model:

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

In my code, I have loaded Parent entity:

Parent parent = <loaded in some way>;

To explicitly load its navigational properties, I use

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

But this results in two DB queries.

Question: is there a more elegant way, that would allow to explicitly load more than one navigational property in single query?

If I didn't have parent loaded, I would do eager loading:

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

but, as I mentioned, I already have it loaded without related entities (and I can't modify the loading code).

1条回答
趁早两清
2楼-- · 2019-06-25 05:56

The only possible way (afaik) is to reload the parent property. Assuming the variable parent is attached to the context:

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

This works, because the context will detect that entity you are looking for is loaded and attached already and therefore not create a new one but rather update the old one (parent in this case).

查看更多
登录 后发表回答