EF4.1 POCO: почему я должен использовать ICollection - PullRequest
6 голосов
/ 22 июня 2011

Почти во всех примерах классов POCO, созданных для коллекций Entity Framework 4.1, определяются с помощью интерфейса ICollection:

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

Однако в моем коде возникает проблема, из-за которой мне нужно получить доступ к члену коллекции по индексу, например ::100100

Персона Paul = TravelTicket.Members [3];

Невозможно применить индексирование с помощью [] к выражению типа 'System.Collections.Generic.ICollection

Итак, как мне обойти эту проблему и всегда ли я должен использовать ICollection для своих коллекций POCO?

Ответы [ 3 ]

11 голосов
/ 22 июня 2011

Это потому, что после того, как вы пометите свое свойство навигации как виртуальное, создается прокси вашей сущности, и он использует HashSet для свойств навигации - хэш-набор не позволяет индексировать. Доступ к связанным сущностям по индексу не выглядит хорошим подходом, поскольку извлечение сущности из базы данных не гарантирует, что связанные сущности всегда будут иметь одинаковый индекс в коллекции.

0 голосов
/ 22 июня 2011

ICollection реализует IEnumerable, вы должны иметь возможность получить элемент по индексу, используя Enumerable.ElementAt<TSource> метод

0 голосов
/ 22 июня 2011

Просто используйте ToList ():

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

EF не будет запрашивать данные, пока вы на самом деле не попытаетесь получить к ним доступ - и коллекция не попытается, пока вы не выполните итерацию, а ToList должен создать экземпляркаждый экземпляр.

Еще лучше, будьте более конкретны:

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

Тогда у вас будет только один ОДИН член - тот, который вам нужен.

Обратите внимание, что вам могут понадобиться Members.AsQueryable (). Где вместо этого - я никогда не помню ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...