[英]Why can I not use the same poco in code first in EF4.1 to project my data?
[英]EF4.1 POCO: Why should I use ICollection
幾乎所有為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集合嗎?
這是因為一旦你將導航屬性標記為虛擬,就會創建實體的代理,並且它使用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<TSource>
方法通過索引獲取項目
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.