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

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

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

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

Department.Hbm.xml

many2many的写法与注意点<bag name="Users" table="TBL_USER_DEP" lazy="true">
many2many的写法与注意点
many2many的写法与注意点      
<key column="DEPARTMENT_ID"/>
many2many的写法与注意点
many2many的写法与注意点      
<many-to-many column="USER_ID" class="NHibernateStudy.Domain.User, NHibernateStudy.Domain"/>
many2many的写法与注意点
many2many的写法与注意点
</bag>
many2many的写法与注意点
many2many的写法与注意点

 

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

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

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

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

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

 

Cs

many2many的写法与注意点private IList<User> users = new List<User>();
many2many的写法与注意点
many2many的写法与注意点
public virtual IList<User> Users
many2many的写法与注意点

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

 

编译与调用

many2many的写法与注意点
many2many的写法与注意点
many2many的写法与注意点
protected void Button4_Click(object sender, EventArgs e)
many2many的写法与注意点

 

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

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

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

many2many的写法与注意点        newUser.Deparments.Add(newDep);
many2many的写法与注意点
many2many的写法与注意点        newUser.Deparments.Add(newDep1);
many2many的写法与注意点
many2many的写法与注意点        
//newDep.Users.Add(newUser);  加入此句话,导致关联表主键重复
many2many的写法与注意点
many2many的写法与注意点        
//newDep1.Users.Add(newUser); 加入此句话,导致关联表主键重复
many2many的写法与注意点

many2many的写法与注意点

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

相关文章:

  • 2021-11-11
  • 2022-12-23
  • 2021-11-18
  • 2022-01-19
  • 2021-12-12
  • 2022-12-23
  • 2021-12-01
  • 2021-11-06
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-24
  • 2021-07-22
  • 2021-07-24
相关资源
相似解决方案