Sto scrivendo un'applicazione C # che utilizza EF Core per generare tutte le mie relazioni con il mio db. Attualmente sto cercando di caricare alcune relazioni solo quando ne ho bisogno (che in questo caso è quando sto cercando di cancellare i record).
Sto cercando di usare Context.Entry per caricare le relazioni richieste solo quando ne ho bisogno, vedi sotto:
await Context.Entry(entity).Collection(e => e.DBTable1).LoadAsync();
await Context.Entry(entity).Collection(e => e.DBTable2).LoadAsync();
Quello di cui sono curioso è se riesci a combinare più relazioni in una singola istruzione di caricamento, qualcosa di simile di seguito:
await Context.Entry(entity).Collection(e => e.DBTable1 && e => e.DBTable2).LoadAsync();
So che posso usare .Include / .ThenIncludere per costruire le relazioni prima di eseguire la query EF, tuttavia, il mio flusso di lavoro richiede che le relazioni vengano caricate dopo che la query è stata eseguita.
Le entità monitorate in EF devono avere le proprietà / le raccolte del tuo browser popolate quando vengono caricati i dati necessari. Prova a proiettare le proprietà / collezioni desiderate in un tipo anonimo e verifica che le proprietà previste siano popolate nell'oggetto entità originale:
await dbContext.Set<TEntity>()
.Where( e => e.Id == entity.Id )
.Select( e => new
{
DoesntMatter01 = e.DBTable1,
DoesntMatter02 = e.DBTable2,
} )
.SingleOrDefaultAsync();
Nota che in realtà non ti interessa il risultato finché la query viene enumerata. In questo caso utilizziamo SingleOrDefault
ma è possibile caricare queste proprietà per tutte le entità tracciate di un determinato tipo nello stesso modo se selezioniamo gli ID di una raccolta di entità, quindi utilizziamo ids.Contains( e.Id )
nel punto in where
predicate e quindi enumerando tramite una chiamata a ToArray
o un metodo simile che restituirà tutti i risultati.
Esegui questo e verifica che le proprietà della raccolta vengano ora compilate come previsto.
Modifica: poiché mi sentivo così motivato:
public Task LoadEntityCollections( DbContext dbContext, IEnumerable<EntityType> entities )
{
dbContext.Set<EntityType>()
.Where( e => entities.Select( ei => ei.Id ).Contains( e.Id ) )
.Select( e => new
{
// assign from properties you want loaded
} )
.ToArrayAsync();
}