Je n'ai regardé que quelques webémissions avant de me lancer dans la conception de quelques applications Entity Framework. Je n'ai vraiment pas lu beaucoup de documentation et j'ai l'impression d'en souffrir maintenant.
J'utilise List<T>
dans mes cours et cela a très bien fonctionné.
Maintenant, j'ai lu une documentation et il indique que j'aurais dû utiliser ICollection<T>
. J'ai changé pour cela, et cela n'a même pas provoqué de changement de contexte du modèle. Est-ce parce que les deux List<T>
et ICollection<T>
héritent IEnumerable<T>
, et c'est ce qui est réellement requis pour EF?
Cependant, si tel est le cas, pourquoi la documentation EF n'indique-t-elle pas qu'elle requiert IEnumerable<T>
au lieu de ICollection<T>
?
Dans tous les cas, y a-t-il des inconvénients à ce que j'ai fait ou dois-je le changer?
List<T>
doit mettre en oeuvre chacune de ces interfaces (IList<T>
,ICollection<T>
,IEnumerable<T>
) en raison de la hiérarchie d'héritage. Pour la fin,IList<T>
reprend aussi les non génériquesIList
,ICollection
et lesIEnumerable
interfaces.ICollection<T>
à la fête (et cette interface apporte avec elleIEnumerable<T>
, donc le "normal "Les opérations Linq sont toujours valides).Ils ont choisi l'interface qu'ils ont créée car elle donne une abstraction compréhensible sur les requêtes magiques que Entity Framework effectue lorsque vous utilisez Linq.
Voici la différence entre les interfaces:
IEnumerable<T>
est en lecture seuleICollection<T>
List<T>
Hors de ceux-ci,
ICollection
etIEnumerable
mappez bien aux opérations de base de données, car l'interrogation et l'ajout / la suppression d'entités sont des choses que vous pouvez faire dans une base de données.L'accès aléatoire par index ne mappe pas non plus, car vous devez avoir un résultat de requête existant pour itérer, ou chaque accès aléatoire interrogerait à nouveau la base de données. De plus, à quoi correspondrait l'index? Numéro de ligne? Il n'y a pas beaucoup de requêtes de numéro de ligne que vous voudriez faire, et ce n'est pas du tout utile pour créer des requêtes plus volumineuses. Donc, ils ne l'appuient tout simplement pas.
ICollection<T>
est pris en charge et vous permettra à la fois d'interroger et de modifier des données, alors utilisez-le.La raison
List<T>
fonctionne pour commencer est que l'implémentation EF finit par en renvoyer une à la fin. Mais c'est à la fin de votre chaîne de requêtes, pas au début. Ainsi, en rendant vos propriétés, ilICollection<T>
sera plus évident que l'EF crée un tas de SQL et ne renvoie qu'unList<T>
à la fin, plutôt que de faire des requêtes pour chaque niveau de Linq que vous utilisez.la source
ICollection diffère de IEnumerable en ce que vous pouvez réellement ajouter des éléments à la collection, alors qu'avec IEnumerable, vous ne pouvez pas. Ainsi, dans vos classes POCO, par exemple, vous souhaitez utiliser ICollection si vous avez l'intention d'autoriser l'ajout de la collection. Rendez l'ICollection virtuelle pour bénéficier également du chargement différé.
la source
Bien que la question ait été postée il y a des années, elle est toujours valable lorsque quelqu'un cherche le même scénario.
Il existe un article récent [2015] CodeProject qui explique la différence en termes de détails et de représentation graphique avec un exemple de code . Il ne se concentre pas directement sur EF mais espère toujours qu'il sera d'une plus grande aide:
List vs IEnumerable vs IQueryable vs ICollection vs IDictionary
la source