ICollection Vs List in Entity Framework

Obejrzałem tylko kilka webcastów, zanim zacząłem projektować kilka aplikacji Entity Framework. Naprawdę nie czytałem tyle dokumentacji i czuję się, jakbym teraz cierpiał z tego powodu.

Używałem List<T> Na moich zajęciach, i to działało świetnie.

Teraz przeczytałem trochę dokumentacji i jest w niej napisane, że powinienem był używać ICollection<T>. Zmieniłem na to i to nawet nie spowodowało zmiany kontekstu modelu. Czy to dlatego, że zarówno List<T> jak i ICollection<T> inherit IEnumerable<T>, i to jest tak naprawdę wymagane dla EF?

Jeśli jednak tak jest, dlaczego dokumentacja EF nie stwierdza, że wymaga IEnumerable<T> zamiast ICollection<T>?

W każdym razie, czy są jakieś wady tego, co zrobiłem, czy powinienem to zmienić?

Author: Anthony Pegram, 2011-10-05

4 answers

Entity Framework używałby ICollection<T>, ponieważ musi obsługiwać operacje Add, które nie są częścią interfejsu IEnumerable<T>.

Zauważ również, że używałeś używając ICollection<T>, jedynie ujawniałeś to jako implementację List<T>. List<T> niesie ze sobą IList<T>, ICollection<T>, i IEnumerable<T>.

Jeśli chodzi o Twoją zmianę, wyświetlanie przez interfejs jest dobrym wyborem, mimo że List<T> działa. Interfejs określa umowę, ale nie realizację. Realizacja Może zmienić. W niektórych przypadkach implementacją może być np. HashSet<T>. (Przy okazji, jest to sposób myślenia, którego możesz użyć dla czegoś więcej niż tylko struktury encji. Dobrą praktyką zorientowaną obiektowo jest programowanie w kierunku interfejsu, a nie implementacji. Wdrożenia mogą i będą się zmieniać.)

 124
Author: Anthony Pegram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-05 02:22:26

Wybrali interfejs, który zrobili, ponieważ daje on zrozumiałą abstrakcję nad magicznymi zapytaniami, które Framework encji wykonuje, gdy używasz Linq.

Oto różnica między interfejsami:

  • IEnumerable<T> Jest Tylko do odczytu
  • możesz dodawać i usuwać elementy do ICollection<T>
  • możesz zrobić losowy dostęp (przez indeks) do List<T>

Z nich, ICollection i IEnumerable dobrze odwzorowują operacje baz danych, od zapytań i dodawania / usuwania encji są rzeczy, które można zrobić w DB.

Random access by index również nie mapuje, ponieważ musiałbyś mieć istniejący wynik zapytania, aby go odtworzyć, albo każdy losowy dostęp ponownie zapytałby bazę danych. Do czego miałby służyć indeks? Numer rzędu? Nie ma zbyt wielu zapytań o liczbę wierszy, które chcesz zrobić, i nie jest to przydatne w ogóle w budowaniu większych zapytań. Więc po prostu tego nie popierają.

ICollection<T> jest obsługiwany i pozwoli Ci zarówno odpytywać, jak i zmieniać dane, więc użyj tego.

Powodem, dla którego List<T> działa, jest to, że implementacja EF ostatecznie zwraca jedną. Ale to jest na końcu łańcucha zapytań, a nie na początku. Więc tworzenie właściwości ICollection<T> sprawi, że będzie bardziej oczywiste, że EF tworzy kilka SQL i zwraca tylko List<T> na końcu, zamiast wykonywać zapytania dla każdego poziomu Linq, którego używasz.

 59
Author: Merlyn Morgan-Graham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-05 02:11:55

ICollection różni się od IEnumerable tym, że możesz faktycznie dodawać elementy do kolekcji, podczas gdy z IEnumerable nie możesz. Tak więc w klasach POCO, na przykład, chcesz użyć ICollection, jeśli chcesz zezwolić na dodawanie kolekcji. Uczyń ICollection wirtualnym, aby korzystać z leniwego ładowania.

 9
Author: Ralph Lavelle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-05 02:01:13

Chociaż pytanie zostało opublikowane lata temu, nadal jest ważne, gdy ktoś szuka tego samego scenariusza.

Istnieje najnowszy artykuł [2015] CodeProject, który wyjaśnia różnicę w wielu szczegółach i graficznej reprezentacji z przykładowym kodem . Nie jest skupiony bezpośrednio na EF, ale nadal mam nadzieję, że będzie bardziej pomocny:

Lista vs IEnumerable vs IQueryable vs ICollection vs IDictionary

 5
Author: BiLaL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-23 18:16:27