系列引入

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等等)。

  1. //Code Snippets Copyright http://lyj.cnblogs.com/
  2. public class ListOfElements
  3. {
  4. public int Id { get; list; }
  5. public IList<string> Elements { get; list; }
  6. }

映射简单写法:

  1. //Code Snippets Copyright http://lyj.cnblogs.com/
  2. <class name="ListOfElements">
  3. <id name="Id" type="Int32">
  4. <generator class="hilo" />
  5. </id>
  6. <list name="Elements" table="ListOfElementsElements">
  7. <key column="ListOfElementsId" />
  8. <list-index />
  9. <element type="String" />
  10. </list>
  11. </class>

单一元素类型在NHibernate中使用<element>映射的,我们应该至少指定column和type类型,假设column没指定,NHibernate提供默认列名id。

数据库架构:

案例二:ListOfComponents

Domain定义中,集合元素通常是组件(Component)类型,也就是值类型。

  1. //Code Snippets Copyright http://lyj.cnblogs.com/
  2. public class ListOfComponents
  3. {
  4. public int Id { get; list; }
  5. public IList<ComponentList> Components { get; list; }
  6. }
  7. public class ComponentList
  8. {
  9. public string StringProperty { get; list; }
  10. public int IntProperty { get; list; }
  11. }

映射简单写法:

  1. //Code Snippets Copyright http://lyj.cnblogs.com/
  2. <class name="ListOfComponents">
  3. <id name="Id" type="Int32">
  4. <generator class="hilo" />
  5. </id>
  6. <list name="Components">
  7. <key column="ListOfComponentsId" />
  8. <list-index />
  9. <composite-element class="ComponentList">
  10. <property name="StringProperty" />
  11. <property name="IntProperty" />
  12. </composite-element>
  13. </list>
  14. </class>

组件(Component)类型使用composite-element映射,须要指明组件类名。然后映射其组件属性。

数据库架构:

案例三:ListOfOneToMany

Domain定义中。集合元素是指向还有一个实体OneToManyList的引用。

这里设置为一对多关系。

  1. //Code Snippets Copyright http://lyj.cnblogs.com/
  2. public class ListOfOneToMany
  3. {
  4. public int Id { get; list; }
  5. public IList<OneToManyList> OneToMany { get; list; }
  6. }
  7. public class OneToManyList
  8. {
  9. public int Id { get; list; }
  10. }

映射简单写法:

  1. //Code Snippets Copyright http://lyj.cnblogs.com/
  2. <class name="ListOfOneToMany">
  3. <id name="Id" type="Int32">
  4. <generator class="hilo" />
  5. </id>
  6. <list name="OneToMany">
  7. <key column="ListOfOneToManyId" />
  8. <list-index />
  9. <one-to-many class="OneToManyList" />
  10. </list>
  11. </class>
  12. <class name="OneToManyList">
  13. <id name="Id" type="Int32">
  14. <generator class="hilo" />
  15. </id>
  16. <property name="Name" />
  17. </class>

我们为ListOfOneToMany和OneToManyList定义一对多关系。使用<one-to-many>映射,指明关联的对象。

数据库架构:

案例四:ListOfManyToMany

Domain定义中,集合元素是指向还有一个实体ManyToManyList的引用。

这里设置为多对多关系。

  1. //Code Snippets Copyright http://lyj.cnblogs.com/
  2. public class ListOfManyToMany
  3. {
  4. public int Id { get; list; }
  5. public IList<ManyToManyList> ManyToMany { get; list; }
  6. }
  7. public class ManyToManyList
  8. {
  9. public int Id { get; list; }
  10. }

映射简单写法:

  1. //Code Snippets Copyright http://lyj.cnblogs.com/
  2. <class name="ListOfManyToMany">
  3. <id name="Id" type="Int32">
  4. <generator class="hilo" />
  5. </id>
  6. <list name="ManyToMany" table="ListOfManyToManyToManyToManyList">
  7. <key column="ListOfManyToManyId" />
  8. <list-index />
  9. <many-to-many class="ManyToManyList" column="ManyToManyListId" />
  10. </list>
  11. </class>
  12. <class name="ManyToManyList">
  13. <id name="Id" type="Int32">
  14. <generator class="hilo" />
  15. </id>
  16. </class>

两个对象的多对多关系。须要一个“中间表”来存储这两个对象的关系。

数据库架构:

结语

開始NH剖析的Mapping篇。这篇文章介绍NHibernate中的集合映射之List映射。

希望本文对你有所帮助。

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

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

    系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...

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

    系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...

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

    ModelMapper概述 NHibernate3.2版本号集成Mapping-By-Code(代码映射),其设计思想来源于ConfORM.代码总体构思基于"Loquacious" ...

  4. Hibernate第四篇【集合映射、一对多和多对一】

    前言 前面的我们使用的是一个表的操作,但我们实际的开发中不可能只使用一个表的-因此,本博文主要讲解关联映射 集合映射 需求分析:当用户购买商品,用户可能有多个地址. 数据库表 我们一般如下图一样设计数 ...

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

    NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来 ...

  6. Python基础篇(set集合)

    Python基础篇(set集合,深浅拷贝) set集合是Python的一个基本类型,一般是不常用.set中的元素是不重复的.无序的里边 的元素必须是可hash的比如int,str,tuple,bool ...

  7. 第二十七篇 玩转数据结构——集合(Set)与映射(Map)

          1.. 集合的应用 集合可以用来去重 集合可以用于进行客户的统计 集合可以用于文本词汇量的统计   2.. 集合的实现 定义集合的接口 Set<E> ·void add(E) ...

  8. Pyhton开发【第五篇】:Python基础之杂货铺

    Python开发[第五篇]:Python基础之杂货铺   字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进 ...

  9. Hadoop生态圈-Hive快速入门篇之HQL的基础语法

    Hadoop生态圈-Hive快速入门篇之HQL的基础语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客的重点是介绍Hive中常见的数据类型,DDL数据定义,DML数据操作 ...

随机推荐

  1. 详解Mysql分布式事务XA(跨数据库事务)

    详解Mysql分布式事务XA(跨数据库事务) 学习了:http://blog.csdn.net/soonfly/article/details/70677138 mysql执行XA事物的时候,mysq ...

  2. Eclipse中高效的快捷键、调试及Junit

    Eclipse中高效的快捷键 当我知道了这些快捷键的用法之后,感觉真的非常兴奋,没想到Eclipse中还有这么多令人惊喜的功能,真的能够提高效率. 内容提示 Alt+/ 用于输入标准库或者keywor ...

  3. FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT

    FATAL ERROR in native method:JDWP No transports initialized,jvmtiError=AGENT_ERROR_TRANSPORT_INIT(19 ...

  4. 杭电(hdu)ACM 4548 美素数

    美素数 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submis ...

  5. 【Java并发编程实战】—–synchronized

    在我们的实际应用其中可能常常会遇到这样一个场景:多个线程读或者.写相同的数据,訪问相同的文件等等.对于这样的情况假设我们不加以控制,是非常easy导致错误的. 在java中,为了解决问题,引入临界区概 ...

  6. Codeforces Round #282 (Div. 1)B. Obsessive String KMP+DP

    B. Obsessive String   Hamed has recently found a string t and suddenly became quite fond of it. He s ...

  7. 看似简单!解读C#程序员最易犯的7大错误

    编程时犯错是必然的,即使是一个很小的错误也可能会导致昂贵的代价,聪明的人善于从错误中汲取教训,尽量不再重复犯错,在这篇文章中,我将重点介绍C#开发人员最容易犯的7个错误. 格式化字符串 在C#编程中, ...

  8. 获得IP地址中文

    string ipFilePath = @"~/App_Data/QQWry.dat"; QQWryLocator QQWry = new QQWryLocator(Server. ...

  9. windows服务更改配置文件

    现场部署的服务所在文件夹内容如上图所示,由于现场数据库服务器更改了IP,所以我服务里的数据库连接字符串也需要修改(注意到日志文件,从某天改了IP后就再也连不上数据库了) 修改过程: 1.打开服务管理, ...

  10. Safari new Date() 兼容问题

    我的时间 var myTime = "2015-12-31 12:10:21"; 正常写法 var  newTime =  new Date(myTime); safari兼容写法 ...