您的位置:首页 > 移动开发

NHibernate3剖析:Mapping篇之集合映射基础(3):List映射

2010-05-12 10:33 453 查看
本节内容

系列引入

List映射

案例分析
案例一:ListOfElements

案例二:ListOfComponents

案例三:ListOfOneToMany

案例四:ListOfManyToMany

结语

系列引入

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),通过<key>映射,其column属性命名方式一般采用"集合持有者类名+Id"命名方式。

索引字段(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映射。

希望本文对你有所帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: