Я просмотрел всего несколько веб-трансляций, прежде чем приступил к разработке нескольких приложений Entity Framework. Я действительно не читал так много документации и чувствую, что сейчас страдаю из-за этого.
Я использовал List<T>
на своих занятиях, и это отлично сработало.
Теперь я прочитал некоторую документацию, и в ней говорится, что я должен был использовать ICollection<T>
. Я перешел на это, и это даже не привело к изменению контекста модели. Это потому, что оба List<T>
и ICollection<T>
наследуют IEnumerable<T>
, а это то, что на самом деле требуется для EF?
Однако, если это так, почему в документации EF не указано, что IEnumerable<T>
вместо ICollection<T>
?
В любом случае, есть ли недостатки в том, что я сделал, или мне стоит это изменить?
List<T>
должен осуществить каждый из этих интерфейсов (IList<T>
,ICollection<T>
,IEnumerable<T>
) из - за иерархии наследования. Для завершения,IList<T>
также поднимает необщиеIList
,ICollection
иIEnumerable
интерфейсы.ICollection<T>
участников (и этот интерфейс приносит с собойIEnumerable<T>
, так что "нормальный «Операции Linq все еще действительны).Они выбрали интерфейс, который они сделали, потому что он дает понятную абстракцию над волшебными запросами, которые Entity Framework выполняет, когда вы используете Linq.
Вот разница между интерфейсами:
IEnumerable<T>
только для чтенияICollection<T>
List<T>
Из них
ICollection
иIEnumerable
хорошо сопоставляются с операциями с базой данных, поскольку запросы и добавление / удаление объектов - это то, что вы можете делать в БД.Произвольный доступ по индексу также не отображается, так как вам нужно будет иметь существующий результат запроса для итерации, иначе каждый случайный доступ будет запрашивать базу данных снова. Кроме того, на что будет отображаться индекс? Номер строки? Не так много запросов с номерами строк, которые вы хотели бы выполнять, и это совершенно бесполезно при построении более крупных запросов. Так что они просто не поддерживают это.
ICollection<T>
поддерживается и позволит вам как запрашивать, так и изменять данные, поэтому используйте его.Причина, по которой
List<T>
работает с самого начала, заключается в том, что реализация EF в конечном итоге возвращает единицу. Но это в конце цепочки запросов, а не в начале. Таким образом, создание ваших свойствICollection<T>
сделает более очевидным, что EF создает связку SQL и возвращает толькоList<T>
в конце, а не выполняет запросы для каждого уровня Linq, который вы используете.источник
ICollection отличается от IEnumerable тем, что вы действительно можете добавлять элементы в коллекцию, тогда как с IEnumerable вы не можете. Итак, в ваших классах POCO, например, вы хотите использовать ICollection, если вы намереваетесь разрешить добавление коллекции в. Сделайте ICollection виртуальным, чтобы получить выгоду от отложенной загрузки.
источник
Хотя вопрос был опубликован много лет назад, он все еще актуален, когда кто-то ищет тот же сценарий.
Недавно вышла статья CodeProject [2015], в которой подробно объясняется разница в графическом представлении с примерами кода . Он не ориентирован непосредственно на EF, но все же надеюсь, что он будет более полезным:
Список против IEnumerable против IQueryable против ICollection против IDictionary
источник