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

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

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

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

Paul Paul = TravelTicket.Members [3];

无法将带有[]的索引应用于类型为“System.Collections.Generic.ICollection”的表达式

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

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

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

ICollection实现IEnumerable ,您应该能够使用Enumerable.ElementAt方法通过索引获取项目