many2many的写法与注意点

所谓many2many就是多对多关系,如人员与权限;人员与部门等。

多对多可以将关联表作为一个实体,相关系的表均采用One2Many方法引用这个关联实体。另外一种就是采用真正的Many2Many方式,如下:

在这种情况下,多对多操纵的是三张表,但只有两个实体类。中间的关系表在Nhibernate中是不当作实体来处理的。

示例代码用的是人员与部门。两个类的写法相同,本文以User与Department为例子。

Department.Hbm.xml

None.gif < bag  name ="Users"  table ="TBL_USER_DEP"  lazy ="true" >
None.gif
None.gif      
< key  column ="DEPARTMENT_ID" />
None.gif
None.gif      
< many-to-many  column ="USER_ID"  class ="NHibernateStudy.Domain.User, NHibernateStudy.Domain" />
None.gif
None.gif
</ bag >
None.gif
None.gif

 

注意:name 属性为在Department类中引用的User数据的名称;

      Table属性:为关联表的名称;lazy属性为延迟加载

严重注意:此处不能加入Inverse=true,刚开始加入这个,导致关系表数据插入不进去。仔细思考一下可知,此时关联表对应的无实体类,而将inverse=true实际上是将关系交给many即关联表对应的实体类,而关联表压根没有实体类,所以也就不可能插入。

       Key column属性指定当前类在关联表中的列的名称,即关联表与该表连接的外键名称

       Many-to-many属性 column:指定,对应的那个类在关联表中的字段,对于Deparment来说就是User类对应的表在关联表中的列。即关联表与User类对应表连接的外键名称。

 

Cs

None.gif private  IList < User >  users  =   new  List < User > ();
None.gif
None.gif
public   virtual  IList < User >  Users
None.gif
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get dot.gifreturn users; }
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set dot.gif{ users = value; }
InBlock.gif
ExpandedBlockEnd.gif        }

None.gif
None.gif

注意: 在变量声明时即生成数组实例。也可以在构造函数中完成此操作。

 

编译与调用

None.gif
None.gif
None.gif
protected   void  Button4_Click( object  sender, EventArgs e)
None.gif
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif
InBlock.gif        NHibernateStudy.Domain.User newUser 
= new NHibernateStudy.Domain.User();
InBlock.gif
InBlock.gif        
InBlock.gif
InBlock.gif        newUser.UserName 
= "zhyuque";
InBlock.gif
InBlock.gif        newUser.Password 
= "abc1231";
InBlock.gif
InBlock.gif        newUser.EmailAddress 
= "zhyuque@cool.com1";
InBlock.gif
InBlock.gif        newUser.LastLogon 
= DateTime.Now;
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif        Deparment newDep 
= new Deparment();
InBlock.gif
InBlock.gif        newDep.Name 
= "新员工培训部";
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif       Deparment newDep1 
= new Deparment();
InBlock.gif
InBlock.gif        newDep1.Name 
= "人事部";
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif        newUser.Deparments.Add(newDep);
InBlock.gif
InBlock.gif        newUser.Deparments.Add(newDep1);
InBlock.gif
InBlock.gif        
//newDep.Users.Add(newUser);  加入此句话,导致关联表主键重复
InBlock.gif
InBlock.gif        
//newDep1.Users.Add(newUser); 加入此句话,导致关联表主键重复
InBlock.gif

InBlock.gif 
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif        
string sTmp = "Congratulate, We are succeed!";
InBlock.gif
InBlock.gif        ISession session 
= Sessions.GetSession();
InBlock.gif
InBlock.gif        ITransaction trans 
= session.BeginTransaction();
InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif        
try
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif
InBlock.gif            session.Save(newDep);
InBlock.gif
InBlock.gif            session.Save(newDep1);
InBlock.gif
InBlock.gif            session.Save(newUser);
InBlock.gif
InBlock.gif           
InBlock.gif
InBlock.gif            trans.Commit();
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
catch
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif
InBlock.gif            trans.Rollback();
InBlock.gif
InBlock.gif            sTmp 
= "Sorry, Please try again!";
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
finally
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif
InBlock.gif            session.Close();
InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif 
InBlock.gif
InBlock.gif        
this.TbxHello.Text = sTmp;
InBlock.gif
InBlock.gif        
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif

 

在调用与编译中一共出现两个问题

1) 关联表数据无法插入,问题解决见上文inverse=true;

2) 插入数据报异常。关键问题就是

None.gif         newUser.Deparments.Add(newDep);
None.gif
None.gif        newUser.Deparments.Add(newDep1);
None.gif
None.gif        
// newDep.Users.Add(newUser);  加入此句话,导致关联表主键重复
None.gif
None.gif        
// newDep1.Users.Add(newUser); 加入此句话,导致关联表主键重复
None.gif

None.gif

如果互相加入,会导致主键重复,所以只需要有一方操作关联表即可

转载于:https://www.cnblogs.com/mintqzy/archive/2007/07/19/824234.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值