ICollection Vs List in Entity Framework

Ho guardato solo alcuni webcast prima di iniziare a progettare alcune applicazioni di Entity Framework. Non ho letto davvero molta documentazione e sento di soffrire per questo ora.

Ho usato List nelle mie classi e ha funzionato alla grande.

Ora ho letto alcuni documenti e afferma che avrei dovuto usare ICollection . Ho cambiato a questo, e non ha nemmeno causato un cambiamento di contesto del modello. Questo perché sia List che ICollection ereditano IEnumerable , e questo è ciò che è effettivamente richiesto per EF?

Tuttavia, se questo è il caso, perché la documentazione EF non afferma che richiede IEnumerable invece di ICollection ?

In ogni caso, ci sono degli svantaggi di ciò che ho fatto, o dovrei cambiarlo?

Entity Framework utilizza ICollection perché deve supportare le operazioni Add , che non fanno parte dell’interfaccia IEnumerable .

Si noti inoltre che si stava utilizzando ICollection , che si stava semplicemente esponendo come implementazione List . List porta con sé IList , ICollection e IEnumerable .

Per quanto riguarda il tuo cambiamento, esponendo tramite l’interfaccia è una buona scelta, nonostante List funzioni. L’interfaccia definisce il contratto ma non l’implementazione. L’implementazione potrebbe cambiare. In alcuni casi, forse l’implementazione potrebbe essere un HashSet , per esempio. (Questo è un modo di pensare che potresti usare per qualcosa di più del semplice Entity Framework: una buona pratica orientata agli oggetti è quella di programmare verso l’interfaccia e non l’implementazione.Le implementazioni possono e cambieranno).

Hanno scelto l’interfaccia che hanno fatto perché forniscono un’astrazione comprensibile rispetto alle query magiche eseguite da Entity Framework quando si utilizza Linq.

Ecco la differenza tra le interfacce:

  • IEnumerable è di sola lettura
  • È ansible aggiungere e rimuovere elementi a un ICollection
  • Puoi fare un accesso casuale (per indice) ad una List

Di questi, ICollection e IEnumerable bene alle operazioni di database, poiché le query e l’aggiunta / rimozione di quadro sono cose che si potrebbero fare in un DB.

Anche l’accesso casuale per indice non viene mappato, dal momento che dovresti avere un risultato di query esistente per iterare su, o ogni accesso casuale potrebbe interrogare nuovamente il database. Inoltre, a cosa sarebbe indirizzato l’indice? Numero di riga? Non ci sono molte query sul numero di righe che vorresti fare, e non è affatto utile nella creazione di query più grandi. Quindi semplicemente non lo supportano.

ICollection è supportato e consente di interrogare e modificare i dati, quindi utilizzalo.

Il motivo per cui List inizia è perché l’implementazione EF finisce per restituirne uno alla fine. Ma questo è alla fine della tua catena di query, non all’inizio. Quindi rendendo le proprietà ICollection renderà più ovvio che l’EF crei una serie di SQL e restituisca solo una List alla fine, invece di fare query per ogni livello di Linq che usi.

ICollection differisce da IEnumerable in quanto è ansible aggiungere elementi alla raccolta, mentre con IEnumerable non è ansible. Pertanto, nelle classi POCO, ad esempio, si desidera utilizzare ICollection se si intende consentire l’aggiunta della raccolta. Rendi virtuale ICollection anche per trarre vantaggio dal caricamento lento.

Sebbene la domanda sia stata postata anni fa, è ancora valida quando qualcuno sta cercando lo stesso scenario.

C’è un recente articolo [2015] CodeProject che spiega la differenza in molti dettagli e rappresentazione grafica con codice di esempio . Non è focalizzato direttamente su EF, ma spero che sarà di maggiore aiuto:

Elenco vs IEnumerable vs IQueryable vs ICollection vs IDictionary