NHibernate 多对多 关系表无法插入数据的解决办法
当我们的数据库表、实体类、配置文件都貌似没有问题的情况下,向具有多对多关系的两表中插入或更新数据时,却意外发现关系表中并没有作相应的数据插入或更新,解决办法:
- 设置好 inverse 属性。
- 设置好 cascade 属性。
- 保存和更新数据的操作放在事务中进行。
下面用典型的用户(User)与角色(Role)这个多对多的关系来举例说明。因为只为了解决问题,所以只用了单向多对多关系。
数据库表

实体类
public class User { public virtual int ID { get; set; } public virtual string Name { get; set; } public virtual IList<Role> Roles { get; set; } }
public class Role { public virtual int ID { get; set; } public virtual string Name { get; set; } }
映射配置
<class name="User" table="T_User"> <id name="ID" column="ID" type="int"> <generator class ="identity"/> </id> <property name="Name" column="Name" /> <bag name="Roles" table="T_User_Role" inverse="false" cascade="all"> <key column="UserID" /> <many-to-many column="RoleID" class="Role" /> </bag> </class>
注意:User的Roles属性一定要设置 inverse="false",cascade"all",当然 cascade 属性也可以根据你的具体需要设置成其它
<class name="Role" table="T_Role"> <id name="ID" column="ID" type="int"> <generator class ="identity"/> </id> <property name="Name" column="Name" /> </class>
执行代码
User user = new User { Name = "Macro K", Roles = new List<Role>{ new Role{ Name = "超级管理员" } } }; ISession session = NHibernateHelper.OpenSession(); ITransaction tr = session.BeginTransaction(); session.Save(user); tr.Commit(); HibernateHelper.CloseSession();
在这里我省略了实现数据访问层和业务逻辑层,另外NHibernateHelper的具体实现也没必要贴出来。
注意:此处数据保存或更新的操作放在了业务 ITransaction 中进行,否则关系表中不会插入数据。
当然,你可以使用其它的业务方式来实现。
浙公网安备 33010602011771号