Je le vois beaucoup dans les tutoriels, avec des propriétés de navigation comme ICollection
.
Est-ce une exigence obligatoire pour Entity Framework? Puis-je utiliser IEnumerable
?
Quel est le but principal d’utiliser ICollection
au lieu de IEnumerable
ou même List
?
Habituellement, ce que vous choisissez dépend des méthodes auxquelles vous devez accéder. En général – IEnumerable<>
(MSDN: http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx ) pour une liste d’objects qui doivent uniquement être itérés, ICollection<>
( MSDN: http://msdn.microsoft.com/en-us/library/92t2ye13.aspx ) pour une liste d’objects à parcourir et à modifier, List<>
pour une liste d’objects à parcourir par itération , modifié, sortingé, etc. (Voir ici la liste complète: http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx ).
D’un sharepoint vue plus spécifique, le chargement paresseux joue pour choisir le type. Par défaut, les propriétés de navigation dans Entity Framework sont fournies avec le suivi des modifications et sont des proxies. Pour que le proxy dynamic soit créé en tant que propriété de navigation, le type virtuel doit implémenter ICollection
.
Une propriété de navigation qui représente la fin “many” d’une relation doit renvoyer un type qui implémente ICollection, où T est le type de l’object à l’autre extrémité de la relation. – Conditions requirejses pour la création de proxy POCO MSDN
Plus d’informations sur la définition et la gestion des relations MSDN
ICollection
est utilisé car l’interface IEnumerable
ne permet pas d’append des éléments, de supprimer des éléments ou de modifier la collection.
Répondant à votre question sur List
:
List
est une classe; la spécification d’une interface permet une plus grande souplesse d’implémentation. Une meilleure question est “pourquoi pas IList
?”
Pour répondre à cette question, considérez ce que IList
ajoute à ICollection
: indexation de nombre entier, ce qui signifie que les éléments ont un ordre arbitraire et peuvent être récupérés par référence à cet ordre. Ce n’est probablement pas significatif dans la plupart des cas, car les éléments doivent probablement être classés différemment selon les contextes.
Il y a une différence de base entre ICollection et IEnumerable
Programme simple:
using System; using System.Collections; using System.Collections.Generic; namespace StackDemo { class Program { static void Main(ssortingng[] 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 ssortingng Name { get; set; } public int Age { get; set; } public Person(ssortingng name,int age) { this.Name = name; this.Age = age; } } }
L’idée de base de l’utilisation d’ ICollection
est de fournir une interface permettant d’accéder en lecture seule à une quantité limitée de données. En fait, vous avez une propriété ICollection.Count . IEnumerable
est plus adapté à certaines chaînes de données où vous lisez jusqu’à un point logique, certaines conditions spécifiées explicitement par le consommateur ou jusqu’à la fin de l’énumération.
Je m’en souviens de cette façon:
IEnumerable a une méthode GetEnumerator () qui permet de lire les valeurs d’une collection sans y écrire. La complexité de l’utilisation de l’énumérateur est prise en charge pour nous par chaque instruction en C #. IEnumerable a une propriété: Current, qui renvoie l’élément en cours.
ICollection implémente IEnumerable et ajoute peu de propriétés supplémentaires dont la plus grande utilisation est Count. La version générique de ICollection implémente les méthodes Add () et Remove ().
IList implémente à la fois IEnumerable et ICollection.
Ce que j’ai fait dans le passé est de déclarer mes collections de classes internes en utilisant IList
, ICollection
ou IEnumerable
(si la liste est statique) selon que je devrai faire un nombre quelconque de méthode dans mon référentiel: énumérer, sortinger / ordonner ou modifier . Quand j’ai juste besoin d’énumérer (et peut-être de sortinger) des objects, je crée une List
temporaire List
pour travailler avec la collection dans une méthode IEnumerable. Je pense que cette pratique ne serait efficace que si la collection est relativement petite, mais cela peut être une bonne pratique en général, idk. S’il vous plaît corrigez-moi s’il y a des preuves pour lesquelles cela ne serait pas une bonne pratique.
Les propriétés de navigation sont généralement définies comme virtuelles afin qu’elles puissent tirer parti de certaines fonctionnalités d’Entity Framework, telles que le chargement différé.
Si une propriété de navigation peut contenir plusieurs entités (comme dans les relations plusieurs-à-plusieurs ou un-à-plusieurs), son type doit être une liste dans laquelle des entrées peuvent être ajoutées, supprimées et mises à jour, telles que 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- application mvc