惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
博客园 - 聂微东
J
Java Code Geeks
Engineering at Meta
Engineering at Meta
Jina AI
Jina AI
D
Docker
B
Blog
S
SegmentFault 最新的问题
宝玉的分享
宝玉的分享
D
DataBreaches.Net
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Y
Y Combinator Blog
N
Netflix TechBlog - Medium
月光博客
月光博客
F
Fortinet All Blogs
爱范儿
爱范儿
H
Help Net Security
腾讯CDC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
WordPress大学
WordPress大学
The Cloudflare Blog
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
U
Unit 42

博客园 - 老公鸡

sharepoint 2010? Jsp中使用数据库连接池. MVC2 学习之 UrlRouting Oracle 基础学习之索引 Oracle基础学习之函数 Oracle 基本操作之sql语句 Oracle基本操作 Oracle 数据库学习一 小黑日记三 结束了 mvc 3 学习 第一天 准备 小黑 成长日记第二天 2011年6月15日,同事捡了一只小猫回来了 NHibernate 学习 第十二天 存储过程的使用 NHibernate 学习 第十天 一对多的外键关系处理 NHibernate 学习 第九天 外键关系的处理之一对一 NHibernate学习 第八天 组件的运用 NHibernate学习 第七天 其它的学习资料 NHibernate学习 第六天 NHibernate 中的查询 NHibernate 学习第五天 用户表的增,删,改,查
NHibernate 学习 第十一天 对多对的关系处理
老公鸡 · 2011-06-15 · via 博客园 - 老公鸡

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

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

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

 public class Role
    {
        
public virtual int Id { getset; }
        
public virtual string R_name { getset; }
        
public virtual string R_desc { getset; }public virtual IList<Menu> Menus { getset; }
    }

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 { getset; }public virtual IList<Role> Roles { getset; }
    }

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

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