Nhibernate学习之many-to-many篇

  1. 学习目的:

通过进一步学习Nhibernate基础知识,掌握用Nhiberate实现多对多的业务逻辑

  1. 开发环境+必要准备

  开发环境: windows 2003,Visual studio .Net 2005,Sql server 2005 developer edition

      前期准备: 学习上两篇单表操作many-to-one篇
 

3.对上篇文章的部分解释

 1)bag节点:用于定义System.Collection.IList类型的集合元素。

属性

用法

举例

name

映射的属性(必须)

name=”SalaryList”

table

映射的数据表(可选) table=”Salary”
lazy 延迟加载(可选) Lazy=true|false
cascade 指示级联操作方式(可选) Cascade=all
inverse 关联由谁负责维护 Inverse=”true”

当lazy=”true”,父类初始化的时候不会自动加载子类集合

 Cascade为级联操作方式,包括: 

属性 用法说明
none 默认值,不进行级联操作
save-update save和update级联
delete 删除级联
delete-orphan 删除不相关的父对象的子对象
all save/update/delete级联
all-delete-orphan all+delete-arphan
  当inverse=”true”的时候代表由子类维护级联关系。这时候如果只往父类中添加子类,但不设定子类的父类,是不能保存子类的

 4.多对多业务模型

    还是用户系统,1个用户职员隶属于多个部门,同时1个部门有多个不同的职员 
    用户和部门之间的数据关系图为:

5.  实现步骤:
  1)User.cs

User.cs

  2)User.hbm.xml 

User.hbm.xml
  3) Departments.cs
Departments
4) Departments.hbm.xml
Departments.hbm.xml
5) 数据操作类 
UserDepartmentFixure.cs
6)单元测试类
UnitTest1.cs
到现在为止,终于更加体会到nhibernate的强大了。继续努力,fight!
files:/Files/jillzhang/simple3.rar
上几篇文章:   Nhibernate学习之起步篇-1 
              Nhibernate分析之华山论剑篇 
              Nhibernate学习起步之many-to-one篇
作者:jillzhang
出处:http://jillzhang.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2007-03-23 23:58 Robin Zhang 阅读(7765) 评论(12) 编辑 收藏

 回复 引用 查看   
#1楼 2007-03-24 08:57 JesseZhao      
最近发现自己连用ado.net写个程序都不会了
看来要重过基础了

 回复 引用   
#2楼 2007-03-24 11:03 张小峰[未注册用户]
不错
下一篇呢,我期待
 回复 引用 查看   
#4楼 2007-03-26 18:06 ^-^Roping.Zong      
你好,能给我联系吗?
我想请教一一些问题?
我有一个Order和一个OrderItem,
是一对多的关系!我想保存Order的时候也把OrderImte保存!
但是程序报错:Unexpected row count: 0; expected: 1
我的Order的映射文件如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain">
<class name="Orders" table="orders">

<id name="Id" column="id" type="Int64" unsaved-value="null">
<generator class="native"/>
</id>
<property column="date" name="Date" not-null="true" update="false" insert="false" />

<many-to-one name="CustomerId" column="customer_id" class="Customers" />

<bag name="LineItemsList" inverse="false" lazy="true" cascade="all" >
<key column="order_id" />
<one-to-many class="LineItems" />
</bag>

</class>
</hibernate-mapping>
----------------------------------------------------------------
item的映射文件如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain">
<class name="LineItems" table="line_items" dynamic-update="true">

<!-- composite primary key support is touchy. View the documentation for syntax. -->
<composite-id access="field">
<key-property name="LineNumber" column="line_number" type="Int32" />
<key-many-to-one name="OrderId" column="order_id" class="Orders" />
</composite-id>
<property column="Quantity" type="Int32" name="Quantity" />

<many-to-one name="ProductId" column="product_id" class="Products" />
</class>
</hibernate-mapping>


代码调用如下:
Int64 myID = 3;
Domain.Products pts = new Products();
pts = DB.Session.Load(typeof(Domain.Products), myID) as Domain.Products;

Domain.LineItems item = new LineItems();
item.ProductId = pts;
item.Quantity = 10;
item.LineNumber = 1;


Domain.Orders ords = new Orders();

Int64 myCuIS = 8;
ords.CustomerId = DB.Session.Load(typeof(Domain.Customers), myCuIS) as Domain.Customers;

ords.AddLineItems(item);


ITransaction transaction = DB.Session.BeginTransaction();

DB.Session.Save(ords);
transaction.Commit();

谢谢Q!
我的MSN:zrphtml@hotmail.com
再次谢谢!

 回复 引用   
#5楼 2007-04-27 21:05 JAMES[未注册用户]
请问 User item = (User)session.Load(typeof(User), uid);这句什么意思的?我刚学.
主要是session.load有什么用?

 回复 引用   
#6楼 2007-10-26 10:30 DF[未注册用户]
请教一个问题,假设UserDepartment表中一个字段,怎么解决这个字段的保存?谢谢,我的MSN:cs_wangwei_cs@hotmail.com
 回复 引用   
#7楼 2008-06-11 11:30 wwdz[未注册用户]
多谢了,刚开始着手搞NHibernate呢,有没有什么关于NHibernate网站的源码? 我手头上的资料少得可怜。
 回复 引用   
#8楼 2008-08-12 08:52 网友[未注册用户]
如果关联表有第三个字段,怎么办?
 回复 引用   
#9楼 2009-08-05 11:49 常平[未注册用户]
高手你好,我想问下你这个程序到底是正确的还是错误的,到底实用不实用