今天我们来看一下一对多的关系,在我们的数据库中不能很好的表达出一对多的关系,一个角色对多个可访问的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; }
}
{
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>
<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;}
}
{
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>();
}
{
//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>();
}
一对多的关系就是这样子的。 明天我们来个多对多的
浙公网安备 33010602011771号