2017-02-13 5 views
0

Ich suche die eleganteste/beste Weg Navigationseigenschaften nach dem Erstellen eines Eintrags zu laden.Eager Laden Entity Framework Kern

Die Situation ist folgende: * ich eine Zeile in meinem Tisch und Link 2 weiteren Tabellen-ID erstellen. Das Objekt, das ich zurückbekomme, enthält nur die IDs, nicht die tatsächlich verknüpften Objekte. * Durch eifrig Laden möchte ich diese Objekte scheinen

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

Nicht laden zu arbeiten, kann ich nicht Kette Referenzen, so konnte ich entweder fragen Sie die komplette Objekt:

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

oder tun dies:

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

Aber das schafft (ich vermute) 2 Anrufe an die Datenbank statt 1 kombinierter Anruf. Oder fehlt mir eine andere Möglichkeit, diese Referenzen zu verketten?

Antwort

2

Für dieses spezifische Szenario, das Sie einfach anonymen Typ Projektion und stützen sich auf die Navigationseigenschaft fix-up wie in Loading Related Data verwenden können:

Tipp
Entity Framework-Core automatisch Fix-Up-Eigenschaften Navigation zu anderen Entitäten, die zuvor in die Kontextinstanz geladen wurden. Auch wenn Sie die Daten für eine Navigationseigenschaft nicht explizit einschließen, kann die Eigenschaft dennoch gefüllt sein, wenn einige oder alle zugehörigen Entitäten zuvor geladen wurden.

Also folgend würde die Arbeit machen:

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

und in der Theorie sollte besser sein (sollte nur in Zusammenhang stehende Daten laden). Doch aufgrund eines aktuellen (v1.1.0) EF Core-Fehler wäre es auch, alle Wurzelobjektfelder umfassen, so dass es Äquivalent der Variante mit Include s machen:

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

Ich persönlich würde die erste Methode verwenden, weil Die Fehler werden hoffentlich in einer zukünftigen EF Core-Version behoben werden, während das zweite Methodenverhalten "per Design" ist.

Verwandte Themen