2011-06-22 21 views
6

En casi todos los ejemplos de clases POCO creados para Entity Framework 4.1 colecciones se definen mediante la interfaz ICollection:EF4.1 POCO: Por qué debería usar ICollection

public class TravelTicket 
{ 
    public virtual int Id { get; set; } 
    public string Destination { get; set; } 
    public virtual ICollection<Person> Members { get; set; } 
} 

Sin embargo, esto causa un problema en mi código donde Necesito acceder a un miembro de la colección por índice, por ejemplo:

Persona Paul = MiembrosTicketTicket [3];

no se puede aplicar la indexación con [] a una expresión de tipo 'System.Collections.Generic.ICollection

Entonces, ¿cómo puedo obtener alrededor de este problema y debería utilizar siempre ICollection para mis colecciones POCO?

Respuesta

11

Es porque una vez que marca su propiedad de navegación virtual, se crea el proxy de su entidad y usa HashSet para las propiedades de navegación; el conjunto de hash no permite la indexación. Acceder a las entidades relacionadas por índice no parece ser un buen enfoque porque recuperar la entidad de la base de datos no garantiza que las entidades relacionadas siempre tengan el mismo índice en la colección.

+1

1; este es el punto más importante de su respuesta: "recuperar la entidad de la base de datos no garantiza que las entidades relacionadas siempre tengan el mismo índice en la colección". – Yuck

+0

Sí, entiendo lo que quiere decir con respecto a la posición de las entidades dentro de la colección. Así que, básicamente, no debería usar un índice y en su lugar usar algo como la sugerencia de Evil Greebo de Person Paul = TravelTicket.Members.Where (m => m.Id == 3) – FloatLeft

0

Sólo tiene que utilizar ToList():

Person Paul = TravelTicket.Members.ToList()[3]; 

EF no va a consultar los datos hasta que realmente se intenta acceder a él - y una colección no trata hasta que iterar a ella, mientras que ToList debe crear una instancia de cada uno ejemplo.

Aún mejor, ser más específico:

Person Paul = TravelTicket.Members.Where(m=>m.Id == 3); // or some such similar filter 

Entonces sólo uno de los miembros ejemplo - el que usted desea. .

Nota es posible que necesite Members.AsQueryable() donde en lugar - no me acuerdo ...

0

ICollection implementa IEnumerable, usted debe ser capaz de conseguir el artículo por el índice de uso de Enumerable.ElementAt<TSource> método

Cuestiones relacionadas