Perché utilizzare ICollection e non IEnumerable o List su relazioni many-many / one-many?

Lo vedo molto nelle esercitazioni, con le proprietà di navigazione come ICollection .

È un requisito obbligatorio per Entity Framework? Posso usare IEnumerable ?

Qual è lo scopo principale dell’utilizzo di ICollection anziché IEnumerable o anche List ?

Di solito ciò che si sceglie dipende dai metodi a cui è necessario accedere. In generale – IEnumerable<> (MSDN: http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx ) per un elenco di oggetti che devono essere solo iterati, ICollection<> ( MSDN: http://msdn.microsoft.com/en-us/library/92t2ye13.aspx ) per un elenco di oggetti che devono essere iterati e modificati, List<> per un elenco di oggetti che devono essere ripetuti tramite , modificato, ordinato, ecc. (Vedere qui per un elenco completo: http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx ).

Da un punto di vista più specifico, il caricamento pigro entra in gioco con la scelta del tipo. Per impostazione predefinita, le proprietà di navigazione in Entity Framework includono il rilevamento delle modifiche e sono proxy. Affinché il proxy dinamico possa essere creato come proprietà di navigazione, il tipo virtuale deve implementare ICollection .

Una proprietà di navigazione che rappresenta la “molti” fine di una relazione deve restituire un tipo che implementa ICollection, dove T è il tipo di object all’altra estremità della relazione. – Requisiti per la creazione di proxy POCO MSDN

Ulteriori informazioni sulla definizione e gestione delle relazioni MSDN

ICollection viene utilizzato perché l’interfaccia IEnumerable non consente di aggiungere elementi, rimuovere elementi o modificare in altro modo la raccolta.

Rispondendo alla tua domanda sulla List :

List è una class; specificare un’interfaccia consente una maggiore flessibilità di implementazione. Una domanda migliore è “perché non IList ?”

Per rispondere a questa domanda, considera ciò che IList aggiunge a ICollection : indice intero, il che significa che gli oggetti hanno un ordine arbitrario e possono essere recuperati facendo riferimento a tale ordine. Questo probabilmente non è significativo nella maggior parte dei casi, dal momento che gli articoli probabilmente devono essere ordinati diversamente in contesti diversi.

Ci sono alcune differenze di base tra ICollection e IEnumerable

  • IEnumerable – Contiene solo il metodo GetEnumerator per ottenere Enumerator e creare un ciclo
  • ICollection contiene i seguenti metodi: Aggiungi / Rimuovi / Contiene / Conteggio / Copia
  • ICollection è ereditato da IEnumerable
  • Con ICollection puoi modificare la collezione usando i metodi come aggiungi / rimuovi, non hai la libertà di fare lo stesso con IEnumerable.

Programma semplice:

 using System; using System.Collections; using System.Collections.Generic; namespace StackDemo { class Program { static void Main(string[] args) { List persons = new List(); persons.Add(new Person("John",30)); persons.Add(new Person("Jack", 27)); ICollection personCollection = persons; IEnumerable personEnumeration = persons; //IEnumeration //IEnumration Contains only GetEnumerator method to get Enumerator and make a looping foreach (Person p in personEnumeration) { Console.WriteLine("Name:{0}, Age:{1}", p.Name, p.Age); } //ICollection //ICollection Add/Remove/Contains/Count/CopyTo //ICollection is inherited from IEnumerable personCollection.Add(new Person("Tim", 10)); foreach (Person p in personCollection) { Console.WriteLine("Name:{0}, Age:{1}", p.Name, p.Age); } Console.ReadLine(); } } class Person { public string Name { get; set; } public int Age { get; set; } public Person(string name,int age) { this.Name = name; this.Age = age; } } } 

L’idea di base dell’utilizzo di ICollection è fornire un’interfaccia per accedere in modo leggibile a una quantità limitata di dati. In effetti hai una proprietà ICollection.Count . IEnumerable è più adatto per qualche catena di dati in cui si legge fino a un certo punto logico, alcune condizioni specificate esplicitamente dal consumatore o fino alla fine dell’enumerazione.

Lo ricordo in questo modo:

  1. IEnumerable ha un metodo GetEnumerator () che consente di leggere i valori in una raccolta ma non di scriverli. La maggior parte della complessità dell’utilizzo dell’enumeratore è gestita da noi per ogni istruzione in C #. IEnumerable ha una proprietà: Current, che restituisce l’elemento corrente.

  2. ICollection implementa IEnumerable e aggiunge alcune proprietà aggiuntive il cui uso maggiore è Count. La versione generica di ICollection implementa i metodi Add () e Remove ().

  3. IList implementa sia IEnumerable che ICollection.

Quello che ho fatto in passato è dichiarare le mie raccolte di classi interne usando IList , ICollection o IEnumerable (se elenco statico) a seconda se dovrò o meno fare un numero qualsiasi di quanto segue in un metodo nel mio repository: enumera, ordina / ordina o modifica . Quando ho solo bisogno di enumerare (e magari ordinare) sugli oggetti, creo una List temporanea List per lavorare con la collezione all’interno di un metodo IEnumerable. Penso che questa pratica sarebbe efficace solo se la collezione è relativamente piccola, ma potrebbe essere una buona pratica in generale, idk. Per favore correggimi se ci sono prove sul perché questa non sarebbe una buona pratica.

Le proprietà di navigazione sono in genere definite come virtuali in modo che possano usufruire di determinate funzionalità di Entity Framework come il caricamento lazy.

Se una proprietà di navigazione può contenere più quadro (come nelle relazioni molti-a-molti o uno-a-molti), il suo tipo deve essere un elenco in cui le voci possono essere aggiunte, eliminate e aggiornate, come ICollection.

https://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net- MVC-applicazione