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

今天我们来看一下多对多的关系 Roles  <-> Menus  ,中间有一个关联表 RoleToMenu 。

它们的关系是 一个角色可以有多个访问菜单,同样一个菜单可能被多个角色使用。多对多关系就出来了

 

1. 首先处理Roles.cs文件,添加一个属性来存放 Menus 集合

 

  public   class  Role
    {
        
public   virtual   int  Id {  get set ; }
        
public   virtual   string  R_name {  get set ; }
        
public   virtual   string  R_desc {  get set ; }

        
public   virtual  IList < Menu >  Menus {  get set ; }
    }

2. 修改Role.bbm.xml 配置文件

 

< bag  name ="Menus"  generic ="true"  table ="RoleToMenu"   >
      
< key  column ="rid"  foreign-key ="FK_RoleToMenu_Roles" />
      
< many-to-many  column ="mid"    class  ="llr.Models.Menu,llr.Models"  foreign-key ="FK_RoleToMenu_Menus" />
    
</ bag >

<key >标签属性说明 :  column 当前配置Role的主键,foreign-key:为关联Roles表的外键名称

<many-to-many >标签属性说明 : column 为Role中关联的Menus表的ID,foreign-key:为关联Menus表的外键名称

3. 修改Menus表,同样也添加存入角色的集合属性

 

public   class  Menu
    {
        
public   virtual   int  Id{ get ; set ;}
        
public   virtual   string  M_title{ get ; set ;}
        
public   virtual   int  M_parnet{ get ; set ;}
        
public   virtual   string  M_url {  get set ; }

        
public   virtual  IList < Role >  Roles {  get set ; }
    }

4. 修改 Menu.hbm.xml

 

< bag  name ="Roles"  generic ="true"  table ="RoleToMenu"   lazy = "false" >
      
< key  column ="mid"  foreign-key ="FK_RoleToMenu_Menus" />
      
< many-to-many  column ="rid"    class  ="llr.Models.Role,llr.Models"
      foreign-key
="FK_RoleToMenu_Roles" />
    
</ bag >

有没有发现跟Role.hbm.xml 差不多呀?同上。只不过把对象主次关系换了一下。

 

5. 取出数据方法,使用SQL来查询

 

public static IList < User >  GetUserRefInfo()
       {

           return session.CreateSQLQuery("select distinct u.*,r.*, m.* from Users u"
               + " inner join Roles r on u.r_id=r.rid"
               + " inner join RoleToMenu rm on rm.rid=r.rid"
               + " inner join Menus m on rm.mid=m.mid")
               .AddEntity("u", typeof(User)).SetResultTransformer(new NHibernate.Transform.DistinctRootEntityResultTransformer())
               .List
< User > ();
       }

 

使用HQL也是可以的,但CreateCriteria试过多次没有成功,估计还是配置有问题,这个留下一个悬疑?

 

6. 显示出来数据

 

void  GetUesrInfo()
    {
        IList
< User >  us  =  UserManager.GetUserRefInfo();
        StringBuilder sb 
=   new  StringBuilder();
        
foreach  (User u  in  us)
        {
            sb.Append(
" 用户: " + u.LogInfo.U_name);
            sb.Append(
" <br/> " );
            sb.Append(
" 权限: " + u.UserRole.R_name);
            
foreach  (llr.Models.Menu m  in  u.UserRole.Menus)
            {
                sb.Append(
" [ " + m.M_title + " ] " );
                sb.Append(
" &nbsp; " );
            }
            sb.Append(
" <br/> " );
        }
        
this .Label1.Text  =  sb.ToString();
    }

 

对多对的操作就是这样,下次我们来试试存储过程

你可能感兴趣的:(Hibernate)