2013-07-09 78 views

回答

11

的IList

  • 雙向關係:不被支持。 (因爲是介紹,以保持孩子,這對孩子元素不能感知的順序一個附加的索引列)
  • 有序:是
  • 類型:IList的
  • 重複:允許
  • 上的添加元素:將加載整個集合以獲取索引列值。避免如果孩子的名單是巨大的。

  • 雙向關係:支持
  • 有序:NO
  • 類型:IList的
  • 重複:允許
  • 上的添加元素:只有一個命中數據庫。沒有性能問題。

的ISet

  • 雙向關係:支持
  • 有序:NO
  • 類型:ISet的(直到NHibernate的3。0它支持的接口從Iesi.Collections
  • 重複:NOT ALLOWED
  • 上的添加元素:整個集合將被載入到檢查重複。避免如果孩子的名單是巨大的。

的ICollection可以作爲孩子收集可以通過任何三個NHibernate的映射

NHibernate的食譜3.0具有使用每個集合的一個很好的解釋的映射的類型,萬一你碰巧遇到它。

+2

我會使用'ICollection '作爲包'IList '暗示有一個命令和一個索引 – cremor

+1

您是否將IList擴展爲不支持雙向關係?我們將所有集合都暴露爲IEnumerable作爲屬性和IList作爲後臺字段,並且我們沒有雙向關係問題。 – epitka

1

任何的IEnumerable意味着延遲執行,所以你要在查詢中使用此當你的檢索是要進行進一步的處理下游(過濾是最明顯的情況下)。

如果情況並非如此,並且確實要確保不會多次枚舉集合,則可以將其作爲IList,ISet或ICollection進行提供。如果您希望確保收集可能有重複,則IList將更受歡迎,而當您希望確保該集合沒有欺騙時(集合行爲在我的經驗中更有用)時,首選ISet。

這兩個IList和ISet 都是 ICollections,它暴露了像Count這樣的裸露骨骼集合行爲。在一個NHib上下文中,你可能會在使用Iesi集合而不是.net HashSet的實現中看到這一點,但這可能與有一次沒有.net HashSet的事實有關,然後NHib的能力存在滯後輕鬆使用它(但NHib 能夠將ICollection映射到Iesi集)。

HTH

+1

「任何IEnumerable表示延遲執行」不正確。所有集合都是IEnumerable。如果您不需要修改集合,那麼沒有任何說法使用IEnumerable屬性映射爲set或bag。 – cremor

+1

@cremor。技術上是真實的,但這仍然是揭示IMO這樣一個集合的主要原因。我把'手段'的措詞改成了'暗示你想要的'。'* * * * * * * * * *重要的: - ) – Berryl

相關問題