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

推荐订阅源

Jina AI
Jina AI
酷 壳 – CoolShell
酷 壳 – CoolShell
小众软件
小众软件
S
Schneier on Security
人人都是产品经理
人人都是产品经理
博客园_首页
L
LangChain Blog
D
Docker
B
Blog
阮一峰的网络日志
阮一峰的网络日志
D
DataBreaches.Net
C
Check Point Blog
WordPress大学
WordPress大学
博客园 - 聂微东
P
Palo Alto Networks Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tailwind CSS Blog
腾讯CDC
Cisco Talos Blog
Cisco Talos Blog
A
Arctic Wolf
C
Cybersecurity and Infrastructure Security Agency CISA
Help Net Security
Help Net Security
The Last Watchdog
The Last Watchdog
有赞技术团队
有赞技术团队
美团技术团队
aimingoo的专栏
aimingoo的专栏
博客园 - 叶小钗
爱范儿
爱范儿
S
Security @ Cisco Blogs
MyScale Blog
MyScale Blog
C
Cisco Blogs
P
Proofpoint News Feed
I
Intezer
Last Week in AI
Last Week in AI
The Register - Security
The Register - Security
IT之家
IT之家
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
H
Help Net Security
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Latest news
Latest news
M
MIT News - Artificial intelligence
N
News | PayPal Newsroom
G
Google Developers Blog
Cloudbric
Cloudbric
T
Troy Hunt's Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Recorded Future
Recorded Future
Hugging Face - Blog
Hugging Face - Blog
AWS News Blog
AWS News Blog

博客园 - 老公鸡

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

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