NHibernate 学习 第十天 一对多的外键关系处理

今天我们来看一下一对多的关系,在我们的数据库中不能很好的表达出一对多的关系,一个角色对多个可访问的Menu,但中间还有一个RoleToMenu的表,所以今天我们用其它表来说明

1. 新建一张订单表与顾客表, 一位顾客可以下许多的订单

结构如下

NHibernate 学习 第十天 一对多的外键关系处理 

 

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 > ();
        }

 

一对多的关系就是这样子的。 明天我们来个多对多的


你可能感兴趣的:(Hibernate)