9

Nei controllori generati da Visual Studio, così come l'applicazione di esempio (ContosoUniversity), l'azione Index ha sempre qualcosa di simileLo scopo di includere() in ASP.NET MVC + Entity Framework

var departments = db.Departments.Include(d => d.Administrator); 

Cosa c'è la differenza tra questo e

var departments = db.Departments; 

per prima cosa ho il sospetto che il primo (con includere) consente la visualizzazione di recuperare department.Administrator. Ma il secondo (senza Include) sembra essere in grado di farlo anche.

risposta

13

Il indica a Entity Framework di caricare avidamente l'amministratore per ogni reparto nei risultati. In questo caso, Entity Framework può utilizzare un join SQL per acquisire i dati da entrambe le tabelle in una singola richiesta.

Il codice funzionerà ancora senza l'Includi, ma la prima volta che si accede all'amministratore di un dipartimento, EF dovrà colpire il database per caricarlo (poiché non è stato precaricato). Il caricamento dei dati su richiesta (pigramente) è una funzionalità interessante, ma può essere un problema di prestazioni gravi (noto come problema N+1). Soprattutto se si accede all'amministratore per ciascun dipartimento (ad esempio, in un ciclo) - invece di una chiamata al database, si finirà con molti!

+0

Non sono sicuro se ho capito correttamente. Con Includi, EF utilizzerà join per catturare entrambi i dipartimenti e i relativi amministratori in un'unica query. Senza Includi, EF prenderà solo i Dipartimenti e poi prenderà i loro Amministratori su richiesta? Quindi, se ho bisogno di uno o due Amministratori nei Depositi, non dovrei usare Includi. Ma se ho bisogno dell'Amministratore di tutti (o molti) dipartimenti, dovrei usare Includi. – Jim

+1

Esattamente, l'inclusione impone che gli amministratori vengano caricati nella stessa query che carica i reparti. Senza l'inclusione, gli amministratori vengono caricati uno alla volta su richiesta. –

+0

@Jim, in particolare, dal momento che si utilizza ASP.NET MVC, non si desidera che le viste contengano il database. E per 'dipartimenti.Primo(). Amministratore' per lavorare senza accesso al database,' Amministratore' deve essere precaricato usando 'Include'. – bzlm

1
var departments = db.Departments; 

Questa volontà recupera i domini aggregati solo se LazyLoadingEnabled sia attivo & MultipleActiveResultSets è impostata su true nella stringa di connessione.

+0

Grazie per la risposta. Ho votato e spero di poter contrassegnare più risposte. – Jim

2

Nel primo caso (con Includi) quando si scrive department.Administrator server l'oggetto dalla memoria che è stato caricato avidamente a causa del metodo Include. Nel secondo caso, verrà eseguita un'istruzione sql per recuperare il record Administrator dal db per ciascun oggetto del dipartimento.

+0

Grazie per la risposta. Ho votato e spero di poter contrassegnare più risposte. – Jim

Problemi correlati