簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM