今天我们来看一下一对多的关系,在我们的数据库中不能很好的表达出一对多的关系,一个角色对多个可访问的Menu,但中间还有一个RoleToMenu的表,所以今天我们用其它表来说明
1. 新建一张订单表与顾客表, 一位顾客可以下许多的订单
结构如下
2. 创建两表的实体类
Customer.cs
public
class
Customer
{
public
virtual
int
Id{
get
;
set
;}
public
virtual
int
Ver{
get
;
set
;}
public
virtual
Name UserName {
get
;
set
; }
//
public virtual string FristName{get;set;}
//
public virtual string LastName { get; set; }
public
virtual
IList
<
Order
>
MyOrder {
get
;
set
; }
}
因为一个顾客可以有多个订单,所以我们属性就添加一个订单的集合 MyOrder
配置Customer.hbm.xml文件,其它属性按我们也前的设置,并对MyOrder进行配置
<
bag
name
="MyOrder"
table
="`Order`"
generic
="true"
inverse
="true"
>
<
key
column
="CustomerId"
foreign-key
="FK_Order_Customer"
/>
<
one-to-many
class
="MyNHibernate.Models.Order,MyNHibernate.Models"
/>
</
bag
>
首先两张表的关系为一对多,所以就有一个节点为 one-to-many ,类似于one-to-one。关键点在于 bag标签,这是告诉nhibernate我这要值出来的是集合
在这里不只是有bag 标签,还有set 等,每一个意思都不一样 bag 返回的值是 IList<Object>类型,所以在实体类里面是定义的IList<Order>。如果你想要用set标签的话那你要定义为 Iset<Order>了。
其它映射关系如下:
Mapping Node |
Interface |
<set> |
Iesi.Collections.ISet |
<bag> |
IList |
<list> |
IList |
<map> |
IDictionary |
详细可查看:http://www.cnblogs.com/eric3298/archive/2010/11/23/1885310.html
3. Order.cs
public
class
Order
{
public
virtual
int
OrderId{
get
;
set
;}
public
virtual
int
Version{
get
;
set
;}
public
virtual
DateTime OrderDate {
get
;
set
;}
public
virtual
Customer Custom{
get
;
set
;}
}
配置文件 Order.hbm.xml
<
many-to-one
name
="Custom"
column
="CustomerId"
not-null
="true"
class
="MyNHibernate.Models.Customer,MyNHibernate.Models"
foreign-key
="FK_Order_Customer"
/>
这里要跟Customer.cs 互相映射一下
4. 访问操作
取数据操作
public
static
IList
<
Customer
>
SelectAll()
{
//
return session.CreateCriteria(typeof(Customer)).CreateCriteria("MyOrder").SetResultTransformer(new NHibernate.Transform.DistinctRootEntityResultTransformer()).List<Customer>();
return
session.CreateSQLQuery(
"
select distinct {customer.*},o.* from Customer {customer}
"
+
"
inner join [Order] o on o.CustomerId={customer}.CustomerId
"
)
.AddEntity(
"
customer
"
,
typeof
(Customer))
.List
<
Customer
>
();
}
一对多的关系就是这样子的。 明天我们来个多对多的