Solo vi algunos webcasts antes de comenzar a diseñar algunas aplicaciones de Entity Framework. Realmente no leí tanta documentación y siento que estoy sufriendo por eso ahora.
Lo he estado usando List<T>
en mis clases y ha funcionado muy bien.
Ahora he leído algo de documentación y dice que debería haber estado usando ICollection<T>
. Cambié a esto y ni siquiera causó un cambio de contexto de modelo. ¿Es esto porque ambos List<T>
y ICollection<T>
heredan IEnumerable<T>
, y eso es lo que realmente se requiere para EF?
Sin embargo, si este es el caso, ¿por qué la documentación de EF no indica que requiere en IEnumerable<T>
lugar de ICollection<T>
?
En cualquier caso, ¿hay inconvenientes en lo que he hecho o debería cambiarlo?
List<T>
tiene que aplicar cada una de dichas interfaces (IList<T>
,ICollection<T>
,IEnumerable<T>
) a causa de la jerarquía de herencia. Para finalizar,IList<T>
también recoge los no genéricosIList
,ICollection
yIEnumerable
las interfaces.ICollection<T>
a la fiesta (y esta interfaz trae consigoIEnumerable<T>
, por lo que la "normal "Las operaciones de Linq siguen siendo válidas).Eligieron la interfaz que hicieron porque brinda una abstracción comprensible sobre las consultas mágicas que realiza Entity Framework cuando usa Linq.
Aquí está la diferencia entre las interfaces:
IEnumerable<T>
es de solo lecturaICollection<T>
List<T>
Fuera de esos,
ICollection
yIEnumerable
mapee bien las operaciones de la base de datos, ya que consultar y agregar / eliminar entidades son cosas que puede hacer en una base de datos.El acceso aleatorio por índice tampoco se asigna, ya que tendría que tener un resultado de consulta existente para iterar, o cada acceso aleatorio volvería a consultar la base de datos. Además, ¿a qué se asignaría el índice? ¿Numero de fila? No hay muchas consultas de números de fila que le gustaría hacer, y no es útil en absoluto para generar consultas más grandes. Entonces simplemente no lo apoyan.
ICollection<T>
es compatible y le permitirá consultar y cambiar datos, así que úselo.La razón por la que
List<T>
funciona para empezar es porque la implementación de EF termina devolviendo una al final. Pero eso está al final de la cadena de consultas, no al principio. Por lo tanto, hacer sus propiedadesICollection<T>
hará que sea más obvio que EF crea un montón de SQL y solo devuelve unList<T>
al final, en lugar de hacer consultas para cada nivel de Linq que use.fuente
ICollection difiere de IEnumerable en que en realidad puede agregar elementos a la colección, mientras que con IEnumerable no puede. Entonces, en sus clases de POCO, por ejemplo, desea usar ICollection si tiene la intención de permitir que se agregue la colección. Haga que ICollection sea virtual para beneficiarse también de la carga diferida.
fuente
Aunque la pregunta se publicó hace años, sigue siendo válida cuando alguien busca el mismo escenario.
Hay un artículo reciente de CodeProject [2015] que explica la diferencia con mucho detalle y representación gráfica con código de muestra . No está enfocado directamente en EF pero aún espero que sea de mayor ayuda:
List vs IEnumerable vs IQueryable vs ICollection vs IDictionary
fuente