2009-12-24 81 views
0

我不想使用ISet,因爲它不是原生集合。我可以使用IList而不是ISet嗎?

我可以逃避使用IList嗎?我的關係都有主鍵,任何時候他們不會使用該集合來修改數據庫等(父集合將處理任何數據庫更新/級聯等)。

+1

NHibernate也不是「本地的」,但你使用的是 - 不真正理解你的反對意見。 –

回答

5

你可以使用IList與<bag>(和<idbag>我相信)。我總是在nHibernate中使用IList,並且我也沒有在開源代碼中經常看到用nHibernate經常使用的ISet。

我很好奇你是使用HBM文件還是流利的nHibernate,與Fluent相比,它非常簡單,只需製作集合IList即可完成剩下的工作。另外,David,nHibernate可能不是「native」,但你不需要在你的領域模型中引用nHibernate(至少我希望你不要)。持久性的無知是nHibernate的特性之一。

我常常多到一個類似的方式關係映射到這一點:

家長:

public IList<Child> Children { get; private set; } 
public AddChild(Child child) { 
    child.Parent = this; 
    Children.Add(child); 
} 

兒童:

public Parent Parent { get; set; } 

你也可以讓孩子IEnumerable和使用一個是IList的後臺字段,但你需要告訴nHibernate如何訪問後臺字段。這使得孩子只能通過AddChild()方法添加。

+0

你如何決定誰是父母,誰是孩子?我猜在一些關係中,這只是一個選擇的問題? – mrblah

+0

對於這個一對多的例子,具有IList屬性的邊是父親,具有單數引用的邊是孩子。因此,例如,如果博客帖子可以有多個評論,Post是父項,Comments是孩子。你在這裏處理多對多的關係嗎? –

4

是的,NHibernate支持IList,但列表是一個不同的集合,而不是一個集合。如果要保持應用程序的行爲相同,並且不想引用iesicollections,則可以將System.Collections.Generic.ICollection與System.Collections.Generic.HashSet一起使用。你仍然需要參考你的解決方案中的Iesicollections,因爲Nhibernate.dll依賴於它。

相關問題