Sto cercando un modo possibile per abilitare il caricamento DbContext
nel mio DbContext
ma non sempre, solo in casi specifici quando ne ho bisogno. A causa di problemi come le query N + 1 con set di dati di grandi dimensioni e serializzazione JSON che attraversano le proprietà degli oggetti e serializzano il mio intero database, di solito non voglio il Caricamento Lazy. Tuttavia, in alcuni casi lo voglio. Durante la generazione di report, carico un oggetto di livello superiore e molti oggetti figlio per popolare i campi del report. A causa della natura dello schema, sarebbero necessarie 30 o più chiamate Include()
e ThenInclude()
senza caricamento ThenInclude()
.
C'è un modo per abilitare il Caricamento Lazy condizionatamente quando si fa una query? Ho provato a utilizzare 2 DbContexts
, con uno che estende l'altro e abilitando il caricamento DbContexts
, come questo:
public class MyLazyContext : MyContext
{
public MyLazyContext(DbContextOptions<MyLazyContext> options) : base(options) { }
protected override OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLazyLoadingProxies();
}
}
E iniettandoli separatamente come dipendenze. Il costruttore ha avuto un problema con il passaggio di DbContextOptions<MyLazyContext>
al costruttore di base che richiede DbContextOptions<MyContext>
quindi li ho modificati entrambi in DbContextOptions<MyContext>
. Mentre questo ha funzionato nella mia applicazione web, i miei test unitari sono stati interrotti a causa del modo in cui i miei generici attivatori di classe hanno funzionato per DbContext
- questo mi ha fatto pensare che questo approccio fosse il codice dell'odore, quindi ho iniziato a cercare una soluzione migliore.
È possibile utilizzare la proprietà ChangeTracker.LazyLoadingEnabled
:
Ottiene o imposta un valore che indica se le proprietà di navigazione per le entità rilevate verranno caricate al primo accesso.
Il valore predefinito è true.
per esempio
context.ChangeTracker.LazyLoadingEnabled = false;
var query = context.Set<…>()...;