Sto cercando il modo più elegante / migliore per caricare le proprietà di navigazione dopo aver creato una voce.
La situazione è questa: * Creo una riga nella mia tabella e collego 2 altre tabelle per ID. L'oggetto che ottengo contiene solo gli id, non gli oggetti collegati reali. * Attraverso il carico desideroso, voglio caricare quegli oggetti
context.Entry(b)
.Reference(e => e.Table1)
.Reference(e => e.Table2)
.Load();
Non sembra funzionare, non posso incatenare Riferimenti, quindi potrei interrogare l'oggetto completo:
context
.Objects
.Where(o => o.ID == id)
.Include(o => o.Table1)
.Include(o => Table2)
.FirstOrDefault();
o fai questo:
context.Entry(b)
.Reference(e => e.Table1)
.Load();
context.Entry(b)
.Reference(e => e.Table2)
.Load();
Ma questo crea (sospetto) 2 chiamate al database invece di 1 chiamata combinata. O mi manca un altro modo per incatenare quei riferimenti?
Per questo specifico scenario è possibile utilizzare la proiezione di tipo anonimo semplice e fare affidamento sulla correzione della proprietà di navigazione come descritto in Caricamento dei dati correlati :
Mancia
Entity Framework Core aggiusterà automaticamente le proprietà di navigazione su qualsiasi altra entità precedentemente caricata nell'istanza di contesto. Pertanto, anche se non includi esplicitamente i dati per una proprietà di navigazione, la proprietà potrebbe ancora essere popolata se alcune o tutte le entità correlate fossero state precedentemente caricate.
Quindi il seguente farebbe il lavoro:
context.Objects
.Where(o => o.ID == id)
.Select(o => new { o.Table1, o.Table2 })
.Load();
e in teoria dovrebbe essere migliore (dovrebbe caricare solo i dati relativi). Tuttavia, a causa di un bug EF Core corrente (v1.1.0), includerebbe anche tutti i campi oggetto radice, rendendolo equivalente alla variante con Include
s:
context.Objects
.Where(o => o.ID == id)
.Include(o => o.Table1)
.Include(o => o.Table2)
.Load();
Personalmente userò il primo metodo perché gli errori si spera siano risolti in qualche futura release di EF Core, mentre il secondo comportamento del metodo è "di progettazione".