EF4.1 POCO:我为什么要使用ICollection

时间:2011-06-22 11:59:29

标签: c# entity-framework-4.1

几乎所有为Entity Framework 4.1创建的POCO类的例子都是使用ICollection接口定义的:

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

但是,这会导致我的代码中出现问题,我需要通过索引访问集合的成员,例如:

Paul Paul = TravelTicket.Members [3];

无法将带有[]的索引应用于“System.Collections.Generic.ICollection

类型的表达式

那么如何解决这个问题呢?我应该总是将ICollection用于我的POCO集合吗?

3 个答案:

答案 0 :(得分:11)

这是因为一旦您将导航属性标记为虚拟,您的实体的代理就会被创建,并且它会使用HashSet作为导航属性 - 哈希集不允许编制索引。通过索引访问相关实体似乎不是一种好方法,因为从数据库中检索实体并不能确保相关实体在集合中始终具有相同的索引。

答案 1 :(得分:0)

只需使用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()。相反 - 我永远不会记得......

答案 2 :(得分:0)

ICollection实现IEnumerable,您应该能够使用Enumerable.ElementAt<TSource>方法按索引获取项目