多对多关系在数据库也是比较常见的,它通过一个中间表将两个主表关联起来。
下面来看看多对多关联在nh的实现,示例是一个User和Group之间的多对多关联。

先来看看User类的映射信息:

在多对多定义中,定义了中间表为UserGroups,此表只有两个字段:user_id和group_id;用于关联Users和Groups表。

User的定义:

public class User {

public User() {
   }

public int UserId
   {
      get { return userId; }
      set { userId = value; }
   }

public int Name
   {
      get { return name; }
      set { name = value; }
   }

public IDictionary Groups
   {
      get { return groups; }
      set { groups = value; }
   }

private int userId;
   private string name;
   private IDictionary groups = new Hashtable();

} //class User

这里用一个数据字典IDictionary对角来保存组对象。

再来看看Group类的映射信息:

这里many-to-many的定义和User类映射信息中的差不多。

组类的定义:

public class Group {

public Group() {
   }

public int GroupId
   {
      get { return groupId; }
      set { groupId = value; }
   }

public int Name
   {
      get { return name; }
      set { name = value; }
   }

public int Description
   {
      get { return description; }
      set { description = value; }
   }

public IDictionary Users
   {
      get { return users; }
      set { users = value; }
   }

private int groupId;
   private string name;
   private IDictionary users = new Hashtable();

} //class Group

注意:多对多没有主次之分,保存时的两边都要save!

下面给出部分测试代码。

public TestCreate() {
   User user1 = new User();
   user1.Name = "test1";
   User user2 = new User();
   user2.Name = "test2";

Group group1 = new Group();
   group1.Name = "group1"; 
   Group group2 = new Group();
   group2.Name = "group2";

user1.Groups.Add( group2, group2 );
   user2.Groups.Add( group1. group1 );
   group1.Users.Add( user2, user2 );
   group2.Users.Add( user1, user1 );

ITransactioin trans = null;
   try {
      trans = session.BeginTransaction();

Session.Save( user1 );
      Session.Save( user2 );
      Session.Save( group1 );
      Session.Save( group2 );

trans.Commit();
   }
   catch ( Exception e ) {
      if ( trans != null ) trans.Rollback();
      throw e;
   }
   finally {
      session.Close();
   }
}

以上测试代码中session的相关操作请查看相关文档。

在实际应用中,我较少使用many-to-many映射,当然这要从性能和实际需要考虑。
我的做法是一个elements来取得所有关联的identity, 然后在需要的时候才加载对象,有点类似lazy, 但lazy有一个问题,就是session必须没有被释放,这在分层开发中较难办到。

nhibernate入门系列: many-to-many映射相关推荐

  1. nhibernate入门系列: 使用Criteria载入对象

    nh会话提供一种使用表达式(就像SQL语句的where表达式)来载入数据的方法, 以取得满足条件的对象集合. 通过CreateCriteria方法, 可以取得一个ICriteria接口, 这个接口用于 ...

  2. 【转】NHibernate入门教程

    开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo 摘要: 热衷于开源框架探索的我发现A ...

  3. xgboost 正则项_XGBoost入门系列第一讲

    Boosted Trees 介绍 XGBoost 是 "Extreme Gradient Boosting"的简称,其中"Gradient Boosting"来 ...

  4. [Eclipse]GEF入门系列(六、添加菜单和工具条)

    我发现一旦稍稍体会到GEF的妙处,就会很自然的被它吸引住.不仅是因为用它做出的图形界面好看,更重要的是,UI中最复杂和细微的问题,在GEF的设计中无不被周到的考虑并以适当的模式解决,当你了解了这些,完 ...

  5. BP算法双向传_链式求导最缠绵(深度学习入门系列之八)

    摘要: 说到BP(Back Propagation)算法,人们通常强调的是反向传播,其实它是一个双向算法:正向传播输入信号,反向传播误差信息.接下来,你将看到的,可能是史上最为通俗易懂的BP图文讲解, ...

  6. C# 3.0入门系列

    目录导航 1 C# 3.0 入门系列(一) 从linq开始引C# 3.0. 2 C# 3.0入门系列(二) 数据库的准备,引入Linq To Sql的准备. 3 C# 3.0入门系列(三) 第一个Li ...

  7. 机器学习入门系列二(关键词:多变量(非)线性回归,批处理,特征缩放,正规方程

    机器学习入门系列二(关键词:多变量(非)线性回归,批处理,特征缩放,正规方程) 目录(?)[+] 一多变量的线性回归 二批处理 三特征缩放 四正规方程 五多变量非线性回归 一.多变量的线性回归 在#机 ...

  8. 机器学习入门系列一(关键词:单变量线性回归,梯度下降法)

    机器学习入门系列一(关键词:单变量线性回归,梯度下降法) 如上图所示,我们的目标是希望通过这些数据得到城市人口数和利润可能的对应关系,并可以通过城市人口数(利润)来预测它的利润(城市人口数),在这里我 ...

  9. (视频+图文)机器学习入门系列-第15章

    机器学习入门系列,黄海广老师主讲.本站将持续更新,ppt.代码.课后习题见文末. 本系列的目录 01.引言 02.回归 03.逻辑回归 04.朴素贝叶斯 05.机器学习实践 06.机器学习库Sciki ...

最新文章

  1. Feign实现服务调用
  2. 使用 VisualVM 进行性能分析及调优
  3. openstack中的server
  4. GDCM:Dicom文件重复的PCDE测试程序
  5. 【线上分享】探讨TensorRT加速AI模型的简易方案:以图像超分为例
  6. 发掘Apache Camel的力量
  7. 如何关闭WINDOWS2003 DEP数据保护功能
  8. python加密敏感信息_仅需10行代码,使用python加密用户敏感数据
  9. linux 端口 操作
  10. 我们究竟什么时候可以使用Ehcache缓存(转)
  11. ASP.NET MVC中加载WebForms用户控件(.ascx)
  12. Java多线程电影院_java 多线程-快乐订座电影院
  13. 境外业务性能优化实践
  14. 【学术相关】明尼苏达大学博导“约法十章”火了:没事不乱开会、合写论文不要催导师,复旦教授直呼值得学习...
  15. Andriod Studio 安装过程
  16. 畅邮(DM Pro)-一款强悍、纯净而稳定的重量级电子邮箱客户端(支持分发、追踪)...
  17. python做个抢购器语言,一起开发苏宁的抢购脚本项目,语言用Python,支持Linux和Windows...
  18. Day1.数据可视化-Python语法
  19. [附源码]计算机毕业设计JAVA社区健康服务平台管理系统lunwen
  20. AD封装与原件的一一对应(+封装管理器的使用)

热门文章

  1. 【转】经典SQL语句大全
  2. 如何判断链表中存在环路
  3. C# Winform控件动态删除
  4. django shortcut函数
  5. Nodejs学习笔记(二)——模块
  6. PHP设置按钮不可用,css怎么控制按钮不可用,button按钮css样式
  7. C语言CRC32 逆向算法源码
  8. Mozilla 发布新 Firefox 用户信息反跟踪策略
  9. Posftix邮箱服务
  10. 八周二次课(5月14日)