摘要

NHibernate的多对多关系映射由many-to-many定义。

从这里下载本文的代码NHibernate Demo

1、修改数据库

添加Product表

添加ProductOrder表

数据库表之间的关系:

Product和Order之间的关系是多对多关系,一条订单上有多个产品,一个产品可以有多个订单。多对多关系中的中间表(这里是ProductOrder表)不需要在关系映射中定义实体类和映射文件。

实际项目中,Product和Order之间应该不是这种简单的多对多关系,而是有个“订单明细”的表OrderDetail,记录了明细记录里产品的数量,单价等信息。如下图:

OrderDetail表:

数据库表之间的关系:

Order和OrderDetail之间,以及Product和OrderDetail之间是两个一对多关系。

作为示例,使用ProductOrder表演示怎么实现多对多关系映射。

实际项目中,角色和用户之间的关系就是典型的多对多关系。

2、修改实体类文件

添加Product类

 using System.Collections.Generic;

 namespace Demo.XML.Entities.Domain
{
public class Product
{
public Product()
{
Orders = new List<Order>();
} public virtual int Id { get; set; } public virtual string ProductCode { get; set; } public virtual string ProductName { get; set; } public virtual string Description { get; set; } public virtual IList<Order> Orders { get; set; }
}
}

修改Order类

 using System;
using System.Collections.Generic; namespace Demo.XML.Entities.Domain
{
public class Order
{
public Order()
{
Products = new List<Product>();
}
public virtual int Id { get; set; }
public virtual DateTime Ordered { get; set; }
public virtual DateTime? Shipped { get; set; }
public virtual Address ShipTo { get; set; }
public virtual Customer Customer { get; set; }
public virtual IList<Product> Products { get; set; }
}
}

3、修改映射文件

添加Product.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Demo.XML.Entities" namespace="Demo.XML.Entities.Domain">
<class name="Product" table="Product">
<id name="Id">
<generator class="native"/>
</id>
<property name="ProductCode" not-null="true"/>
<property name="ProductName" not-null="true"/>
<property name="Description"/>
<bag name="Orders" table="ProductOrder" cascade="all">
<key column="ProductId"/>
<many-to-many class="Order" column="OrderId"/>
</bag>
</class>
</hibernate-mapping>

修改Order.hbm.xml文件

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Demo.XML.Entities" namespace="Demo.XML.Entities.Domain">
<class name="Order" table="`Order`">
<id name="Id">
<generator class="native"/>
</id>
<property name="Ordered"/>
<property name="Shipped"/>
<component name="ShipTo">
<property name="Street"/>
<property name="City"/>
<property name="Province"/>
<property name="Country"/>
</component>
<many-to-one name="Customer" column="CustomerId" cascade="save-update"/>
<bag name="Products" table="ProductOrder" cascade="all">
<key column="OrderId"/>
<many-to-many class="Product" column="ProductId"/>
</bag>
</class>
</hibernate-mapping>

注意:Product和Order两边都设置了cascade="all"。这样,不管从哪边Product或者Order对数据进行添加、修改、删除都能够进行级联更新。

因为是用IList作为级联属性的类型,所以在映射文件里用Bag属性。

这里同样的是使用了双向关联。两个映射文件的Bag属性内容刚好是“对称性”的。

4、添加接口IProductService和类ProductService,修改Program.cs文件

在Program类添加静态属性productService。

static readonly IProductService productService = new ProductService();

修改Main函数

         static void Main(string[] args)
{
HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize(); var product = new Product
{
ProductName = "apple",
ProductCode = "",
Orders = new List<Order>
{
new Order {
Ordered = DateTime.Now
}
}
};
productService.Save(product); Console.WriteLine("Completed");
Console.ReadLine();
}

执行程序,得到类似下图的监控结果。

读者可以自己尝试添加Order对象。

删除和修改请读者自己尝试吧,贴代码和图片太繁琐了。

NHibernate系列文章十九:NHibernate关系之多对多关系(附程序下载)的更多相关文章

  1. NHibernate系列文章十:NHibernate对象二级缓存下

    摘要 上一节对NHibernate二级缓存做了简单介绍,NHibernate二级缓存是由SessionFactory管理的,所有Session共享.这一节介绍二级缓存其他两个方面:二级缓存查询和二级缓 ...

  2. NHibernate系列文章十八:NHibernate关系之一对多(附程序下载)

    摘要 这篇文章介绍NHibernate最实用的内容:关系映射. NHibernate的关系映射方式有三种: Set:无序对象集合,集合中每一个元素不能重复. List:有序对象集合,集合中的元素可以重 ...

  3. NHibernate系列文章十五:NHibernate组件

    摘要 前面文章介绍了NHibernate对简单.net数据类型的映射对照表.NHibernate也可以映射复杂数据类型,这里介绍通过组件映射NHibernate值对象. 1. NHibernate引用 ...

  4. NHibernate系列文章十六:使用程序集管理NHibernate项目(附程序下载)

    摘要 在实际的项目中,经常是将NHibernate的实体关系映射类做成独立的工程(assembly dll),只对外提供Session调用的接口.这个程序集作为数据访问层,可以被上面的多个工程(ASP ...

  5. NHibernate系列文章一:NHibernate介绍

    摘要 NHibernate是一个成熟的开源的面向对象的.net映射框架.大量的实际项目中正在使用该框架.他是建立在ADO.Net基础之上.目前的版本是NHibernate 4.0.4.本系列文章都是基 ...

  6. NHibernate系列文章十七:NHibernate Session管理(附程序下载)

    摘要 NHibernate的Session的管理涉及到NHibernate的两个最重要的对象ISessionFactory和ISession.ISessionFactory的生成非常消耗资源,通常都在 ...

  7. NHibernate系列文章四:NHibernate运行时监控

    摘要 有三种方式可以实现NHibernate运行时监控,监控的信息包括:执行了的SQL语句.NHibernate执行过程.数据库性能分析.这对我们学习NHibernate有很大的帮助,在工作中也能快速 ...

  8. NHibernate系列文章八:NHibernate对象一级缓存

    摘要 Nhibernatea缓存非常强大,按照缓存存储在Session对象还是SessionFactory对象分为一级缓存和二级缓存. 一级缓存存在于Session对象里,也叫Session缓存,由S ...

  9. NHibernate系列文章十二:Load/Get方法

    摘要 NHibernate提供两个方法按主键值查找对象:Load/Get. 1. Load/Get方法的区别 Load: Load方法可以对查询进行优化. Load方法实际得到一proxy对象,并不立 ...

随机推荐

  1. javaweb--上传文件使用灵活的自定义添加

    //upload2.jsp <%@ page language="java" import="java.util.*" pageEncoding=&quo ...

  2. 简单poi读取excel

    1.添加依赖jar包 maven配置: <!-- poi being --> <dependency> <groupId>org.apache.poi</gr ...

  3. PostgreSQL数据库基本配置

    一.安装 首先安装PostgreSQL客户端: sudo apt-get install postgresql-client 然后,安装PostgreSQL服务器: sudo apt-get inst ...

  4. GridView 控件中如何绑定 CheckBoxList

    需求:设计这样一个页面,在页面上可以选择和展示各省份对应的文明城市? 思路:一次性查询出所需的记录(查询数据库的操作不宜写到 C# 代码的循环语句中),并保存到全局变量中,之后根据条件过滤出需要的.可 ...

  5. MySql数据库索引原理

    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将 ...

  6. Streaming replication slots in PostgreSQL 9.4

    Streaming replication slots are a pending feature in PostgreSQL 9.4, as part of the logical changese ...

  7. testNG中同一个test节点上class的执行顺序

    如果每个class中都有setUp(),那么先执行所有class的setUp方法,之后再执行具体的测试方法.这样就导致只有最后一个测试能通过,其他测试都失败了. 具体设置如下图:

  8. Intellij IDEA连接Git@OSC

    错误提示:fatal: remote origin already exists. 解决办法:$ git remote rm origin http://my.oschina.net/lujianin ...

  9. 墨菲定律-Murphy's Law (转载)

    墨菲定律 “墨菲定律”(Murphy's Law)亦称莫非定律.莫非定理.或摩菲定理,是西方世界常用的俚语. “墨菲定律”:事情往往会向你所想到的不好的方向发展,只要有这个可能性.比如你衣袋里有两把钥 ...

  10. 全景VR视频外包公司:长年承接VR全景视频外包(技术分享YouTube的360全景视频)

    虽然比预期来得晚了些,但YouTube终于支持360度全景视频了,这应该会吸引不少VR(虚拟现实)爱好者.今年1月,Google就表示这一功能将在“接下来”的几周出现.现在YouTube上已经有了一些 ...