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 中进行,否则关系表中不会插入数据。

当然,你可以使用其它的业务方式来实现。

 

posted @ 2018-10-29 16:25  RexChou  阅读(223)  评论(0)    收藏  举报