Capisco la frustrazione dei PO, questo uso del virtuale non è per l'astrazione ispirata per cui il modificatore virtuale defacto è efficace.
Se qualcuno sta ancora lottando con questo, vorrei offrire il mio punto di vista, mentre cerco di mantenere le soluzioni semplici e il gergo al minimo:
Entity Framework in un semplice pezzo utilizza un caricamento lento, che equivale a preparare qualcosa per l'esecuzione futura. Questo si adatta al modificatore "virtuale", ma c'è di più in questo.
In Entity Framework, l'utilizzo di una proprietà di navigazione virtuale consente di denotarlo come equivalente di una chiave esterna nullable in SQL. Non DEVI unirti con entusiasmo a tutte le tabelle con chiave durante l'esecuzione di una query, ma quando hai bisogno delle informazioni, queste diventano basate sulla domanda.
Ho anche menzionato nullable perché all'inizio molte proprietà di navigazione non sono rilevanti. cioè in uno scenario cliente / ordini, non è necessario attendere fino al momento in cui un ordine viene elaborato per creare un cliente. Puoi, ma se hai avuto un processo in più fasi per raggiungere questo obiettivo, potresti trovare la necessità di conservare i dati dei clienti per un successivo completamento o per la distribuzione in ordini futuri. Se fossero state implementate tutte le proprietà di navigazione, dovresti stabilire ogni chiave esterna e campo relazionale sul salvataggio. Questo in realtà riporta i dati in memoria, il che sconfigge il ruolo della persistenza.
Quindi, sebbene possa sembrare criptico nell'esecuzione effettiva in fase di esecuzione, ho trovato che la migliore regola empirica da utilizzare sarebbe: se si stanno producendo dati (lettura in un modello di visualizzazione o modello serializzabile) e sono necessari valori prima dei riferimenti, non usa virtuale; Se il tuo ambito sta raccogliendo dati che potrebbero essere incompleti o necessari per la ricerca e che non richiedono tutti i parametri di ricerca completati per una ricerca, il codice farà buon uso del riferimento, simile all'utilizzo delle proprietà con valore nulla int? lungo?. Inoltre, l'astrazione della logica aziendale dalla raccolta dei dati fino alla necessità di iniettarla presenta numerosi vantaggi in termini di prestazioni, simili all'istanza di un oggetto e all'avvio da null. Entity Framework utilizza molte riflessioni e dinamiche, che possono degradare le prestazioni e la necessità di disporre di un modello flessibile in grado di adattarsi alle esigenze è fondamentale per la gestione delle prestazioni.
Per me, ha sempre avuto più senso che usare un gergo tecnologico sovraccarico come delegati, delegati, gestori e simili. Una volta raggiunto il terzo o il quarto lang di programmazione, può diventare confuso con questi.