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

系列引入

NHibernate3.0剖析系列分别从Configuration篇、Mapping篇、Query篇、Session策略篇、应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本号。

假设你还不熟悉NHibernate。能够高速阅读NHibernate之旅系列文章导航系列入门,假设你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧。

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映射。

希望本文对你有所帮助。

时间: 2024-10-06 03:31:14

NHibernate3剖析:Mapping篇之集合映射基础(3):List映射的相关文章

NHibernate3剖析:Mapping篇之集合映射基础(4):Map映射

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

NHibernate3剖析:Mapping篇之集合映射基础(2):Bag映射

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

NHibernate3剖析:Mapping篇之ConfORM实战(3):OneToOne语义

系列引入 NHibernate3剖析系列分别从Configuration篇.Mapping篇.Session篇.Core篇.Tool篇.Practice篇.Extension篇等方面全面揭示NHibernate3版本内容.特性及其应用,完全基于NHibernte3版本. NHibernate专题:http://kb.cnblogs.com/zt/nhibernate/ NHibernate官方站点:http://nhforge.org/ NHibernate参考文档:http://nhforge

NHibernate3剖析:Mapping篇之ConfORM实战(2):原理

系列引入 NHibernate3剖析系列分别从Configuration篇.Mapping篇.Session篇.Core篇.Tool篇.Practice篇.Extension篇等方面全面揭示NHibernate3版本内容.特性及其应用,完全基于NHibernte3版本. NHibernate专题:http://kb.cnblogs.com/zt/nhibernate/ NHibernate官方站点:http://nhforge.org/ NHibernate参考文档:http://nhforge

NHibernate3剖析:Mapping篇之Mapping概览

Mapping概述 NHibernate作为典型的ORM工具,我们使用时通常是先定义Domain,再为Domain映射数据库关系,NHibernate映射是使用XML文件形式的.本篇从整体上了解下NHibernate Mapping处理过程及我们编写方式. Mapping处理过程 当我们Confrontation NHibernate时,NHibernate对Mapping部分到底做了什么事情呢? 解析读取Mapping文件 将Mapping文件反序列化(Deserialize)为XmlDese

NHibernate3剖析:Query篇之NHibernate.Linq增强查询

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

NHibernate3剖析:Query篇之NHibernate.Linq自定义扩展

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

NHibernate剖析:Mapping篇之Mapping-By-Code(1):概览

ModelMapper概述 NHibernate3.2版本集成Mapping-By-Code(代码映射),其设计思想来源于ConfORM,代码整体构思基于"Loquacious"模式,而不是"fluent-interface".在NHibernate.Mapping.ByCode命名空间下. Mapping-By-Code(代码映射)与其他映射方式不同,Mapping-By-Code是手动配置实体映射,编译映射并转换为HbmMapping对象, 调用Configur

NHibernate 映射基础(第三篇) 简单映射、联合主键

NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来一个简单的例子,然后随着不断地对这个例子修修改改,从而真正了解映射文件.具体的资料可以查看http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html 先来看一张表: 映射文件Product.hbm.xml: <?xml versi