Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Explicit loading of multiple references/collections on entity

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).

like image 431
lxa Avatar asked Mar 12 '15 15:03

lxa


1 Answers

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).

like image 84
Tim Pohlmann Avatar answered Sep 22 '22 10:09

Tim Pohlmann