wake-up-neo.com

ICollection <T> Vs List <T> im Entity Framework

Ich habe nur ein paar Webcasts angesehen, bevor ich mich mit dem Entwerfen einiger Entity Framework-Anwendungen befasst habe. Ich habe wirklich nicht so viel Dokumentation gelesen und ich habe das Gefühl, dass ich jetzt darunter leide.

Ich habe List<T> In meinen Klassen verwendet und es hat großartig funktioniert.

Jetzt habe ich eine Dokumentation gelesen und es heißt, ich hätte ICollection<T> Verwenden sollen. Ich habe das geändert und es hat nicht einmal eine Änderung des Modellkontexts verursacht. Liegt das daran, dass sowohl List<T> Als auch ICollection<T>IEnumerable<T> Erben, und das ist es, was für EF tatsächlich erforderlich ist?

Wenn dies jedoch der Fall ist, warum wird in der EF-Dokumentation nicht angegeben, dass IEnumerable<T> Anstelle von ICollection<T> Erforderlich ist?

Gibt es in jedem Fall Nachteile bei dem, was ich getan habe, oder sollte ich es ändern?

97
wil

Entity Framework würde ICollection<T> Verwenden, da es Add -Operationen unterstützen muss, die nicht Teil der IEnumerable<T> - Schnittstelle sind.

Beachten Sie auch, dass Sie waren mit ICollection<T> Lediglich die Implementierung List<T> Verfügbar gemacht haben. List<T> Bringt IList<T>, ICollection<T> Und IEnumerable<T> Mit.

Für Ihre Änderung ist das Belichten über die Benutzeroberfläche eine gute Wahl, obwohl List<T> Funktioniert. Die Schnittstelle definiert den Vertrag, nicht aber die Implementierung. Die Implementierung könnte ändern. In einigen Fällen könnte die Implementierung beispielsweise ein HashSet<T> Sein. (Dies ist übrigens eine Denkweise, die Sie nicht nur für Entity Framework verwenden können. Eine gute objektorientierte Praxis besteht darin, auf die Schnittstelle und nicht auf die Implementierung zu programmieren. Die Implementierungen können und werden sich ändern.)

98
Anthony Pegram

Sie haben die Schnittstelle ausgewählt, die sie verwendet haben, weil sie eine verständliche Abstraktion über die magischen Abfragen liefert, die das Entity Framework bei Verwendung von Linq ausführt.

Hier ist der Unterschied zwischen den Schnittstellen:

  • IEnumerable<T> Ist schreibgeschützt
  • Sie können einem ICollection<T> Artikel hinzufügen und daraus entfernen.
  • Sie können einen zufälligen Zugriff (nach Index) auf einen List<T>

Von diesen ordnen ICollection und IEnumerable Datenbankoperationen gut zu, da das Abfragen und Hinzufügen/Entfernen von Entitäten in einer Datenbank möglich ist.

Der zufällige Zugriff nach Index wird auch nicht zugeordnet, da Sie ein vorhandenes Abfrageergebnis benötigen, um einen Iterationsvorgang durchzuführen, da sonst bei jedem zufälligen Zugriff die Datenbank erneut abgefragt wird. Auf was würde der Index sich auch abbilden? Zeilennummer? Es gibt nicht viele Zeilennummernabfragen, die Sie ausführen möchten, und es ist überhaupt nicht nützlich, um größere Abfragen aufzubauen. Sie unterstützen es einfach nicht.

ICollection<T> Wird unterstützt und ermöglicht das Abfragen und Ändern von Daten.

Der Grund, warum List<T> Anfänglich funktioniert, ist, dass die EF-Implementierung am Ende eine zurückgibt. Aber das ist am Ende Ihrer Abfragekette, nicht am Anfang. Wenn Sie also Ihre Eigenschaften ICollection<T> Festlegen, wird klarer, dass die EF eine Reihe von SQL-Anweisungen erstellt und am Ende nur List<T> Zurückgibt, anstatt Abfragen für jede von Ihnen verwendete Linq-Ebene durchzuführen.

47

ICollection unterscheidet sich von IEnumerable darin, dass Sie der Auflistung Elemente hinzufügen können, während dies mit IEnumerable nicht möglich ist. In Ihren POCO-Klassen möchten Sie beispielsweise ICollection verwenden, wenn Sie das Hinzufügen der Auflistung zulassen möchten. Machen Sie die ICollection virtuell, um auch vom langsamen Laden zu profitieren.

8
Ralph Lavelle

Obwohl die Frage schon vor Jahren gestellt wurde, ist sie immer noch gültig, wenn jemand dasselbe Szenario sucht.

Es gibt einen aktuellen [2015] CodeProject-Artikel, der den Unterschied in vielen Details und grafischen Darstellungen mit Beispielcode erklärt. Es ist nicht direkt auf EF fokussiert, aber ich hoffe immer noch, dass es eine größere Hilfe sein wird:

Liste vs IEnumerable vs IQueryable vs ICollection vs IDictionary

3
BiLaL