NHibernate3剖析:Mapping篇之集合映射基礎(3):List映射
系列引入
NHibernate3.0剖析系列分別從Configuration篇、Mapping篇、Query篇、Session策略篇、應用篇等方面全面揭示NHibernate3.0新特性和應用及其各種應用程序的集成,基於NHibernte3.0版本號。
假設你還不熟悉NHibernate。能夠高速閱讀NHibernate之旅系列文章導航系列入門,假設你已經在用NHibernate了,那麽請跟上NHibernate3.0剖析系列吧。
- NHibernate專題:http://kb.cnblogs.com/zt/nhibernate/
- NHibernate官方網站:http://nhforge.org/
- NHibernate參考文檔:http://nhforge.org/doc/nh/en/
- 獲取NHibernate地址:http://sourceforge.net/projects/nhibernate/
List映射
這節我們介紹List映射,一般而言,Domain中的System.Collections.Generic.IList<T>集合類型使用List來映射。
映射綱要
List映射有三個部分:集合外鍵(Collection foreign keys)、索引字段(index column)、集合元素(Collection element)。
集合外鍵(Collection foreign keys)
索引字段(index column),用於相應數組或List的索引,是Int類型。有順序排列的整數(默認base為0,字段名稱為idx)。
通過<list-index>映射。
集合元素(Collection element),即集合中的對象:
- 值類型。其聲明周期全然依賴於集合持有者。通過<element>或<composite-element>映射。
- 引用類型,被作為集合持有的狀態考慮的。僅僅有兩個對象之間的“連接”。具有其自己的生命周期。通過<one-to-many>或<many-to-many>映射。
案例分析
案例一:ListOfElements
Domain定義中,集合元素通常是單一元素(Elements)類型,即.Net基本類型(string、int、double等等)。
//Code Snippets Copyright http://lyj.cnblogs.com/
public class ListOfElements
{
public int Id { get; list; }
public IList<string> Elements { get; list; }
}
映射簡單寫法:
//Code Snippets Copyright http://lyj.cnblogs.com/
<class name="ListOfElements">
<id name="Id" type="Int32">
<generator class="hilo" />
</id>
<list name="Elements" table="ListOfElementsElements">
<key column="ListOfElementsId" />
<list-index />
<element type="String" />
</list>
</class>
單一元素類型在NHibernate中使用<element>映射的,我們應該至少指定column和type類型,假設column沒指定,NHibernate提供默認列名id。
數據庫架構:
案例二:ListOfComponents
Domain定義中,集合元素通常是組件(Component)類型,也就是值類型。
//Code Snippets Copyright http://lyj.cnblogs.com/
public class ListOfComponents
{
public int Id { get; list; }
public IList<ComponentList> Components { get; list; }
}
public class ComponentList
{
public string StringProperty { get; list; }
public int IntProperty { get; list; }
}
映射簡單寫法:
//Code Snippets Copyright http://lyj.cnblogs.com/
<class name="ListOfComponents">
<id name="Id" type="Int32">
<generator class="hilo" />
</id>
<list name="Components">
<key column="ListOfComponentsId" />
<list-index />
<composite-element class="ComponentList">
<property name="StringProperty" />
<property name="IntProperty" />
</composite-element>
</list>
</class>
組件(Component)類型使用composite-element映射,須要指明組件類名。然後映射其組件屬性。
數據庫架構:
案例三:ListOfOneToMany
Domain定義中。集合元素是指向還有一個實體OneToManyList的引用。
這裏設置為一對多關系。
//Code Snippets Copyright http://lyj.cnblogs.com/
public class ListOfOneToMany
{
public int Id { get; list; }
public IList<OneToManyList> OneToMany { get; list; }
}
public class OneToManyList
{
public int Id { get; list; }
}
映射簡單寫法:
//Code Snippets Copyright http://lyj.cnblogs.com/
<class name="ListOfOneToMany">
<id name="Id" type="Int32">
<generator class="hilo" />
</id>
<list name="OneToMany">
<key column="ListOfOneToManyId" />
<list-index />
<one-to-many class="OneToManyList" />
</list>
</class>
<class name="OneToManyList">
<id name="Id" type="Int32">
<generator class="hilo" />
</id>
<property name="Name" />
</class>
我們為ListOfOneToMany和OneToManyList定義一對多關系。使用<one-to-many>映射,指明關聯的對象。
數據庫架構:
案例四:ListOfManyToMany
Domain定義中,集合元素是指向還有一個實體ManyToManyList的引用。
這裏設置為多對多關系。
//Code Snippets Copyright http://lyj.cnblogs.com/
public class ListOfManyToMany
{
public int Id { get; list; }
public IList<ManyToManyList> ManyToMany { get; list; }
}
public class ManyToManyList
{
public int Id { get; list; }
}
映射簡單寫法:
//Code Snippets Copyright http://lyj.cnblogs.com/
<class name="ListOfManyToMany">
<id name="Id" type="Int32">
<generator class="hilo" />
</id>
<list name="ManyToMany" table="ListOfManyToManyToManyToManyList">
<key column="ListOfManyToManyId" />
<list-index />
<many-to-many class="ManyToManyList" column="ManyToManyListId" />
</list>
</class>
<class name="ManyToManyList">
<id name="Id" type="Int32">
<generator class="hilo" />
</id>
</class>
兩個對象的多對多關系。須要一個“中間表”來存儲這兩個對象的關系。
數據庫架構:
結語
開始NH剖析的Mapping篇。這篇文章介紹NHibernate中的集合映射之List映射。
希望本文對你有所幫助。
NHibernate3剖析:Mapping篇之集合映射基礎(3):List映射