NHibernate映射多对多关系

NHibernate映射多对多关系,nhibernate,Nhibernate,我无法映射多对多关系!我有一个用户表、角色表和用户角色表。一个用户可以有许多角色。Roles表只存储管理员、编辑器等角色的名称。Userroles表存储用户与角色的关系 保存用户时,会保存用户信息,但不会保存角色信息 以下是我的映射: <?xml version="1.0"?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" assembly="EStudy.Busi

我无法映射多对多关系!我有一个用户表、角色表和用户角色表。一个用户可以有许多角色。Roles表只存储管理员、编辑器等角色的名称。Userroles表存储用户与角色的关系

保存用户时,会保存用户信息,但不会保存角色信息

以下是我的映射:

       <?xml version="1.0"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
auto-import="true" assembly="EStudy.Business" namespace="EStudy.Business.Entities">
  <class name="EStudy.Business.Entities.User, EStudy.Business" lazy="false" table="Users">
    <id name="Id" access="property" column="UserId">
      <generator class="native" />
    </id>

    <property name="UserName" access="property" column="UserName" />
    <property name="Password" access="property" column="Password" />
    <property name="FirstName" access="property" column="FirstName"/>
    <property name="LastName" access="property" column="LastName"/>
    <property name="DateCreated" access="property" column="DateCreated" generated="insert" type="datetime" />
    <property name="DateModified" access="property" generated="always" column="DateModified" type="datetime" />


    <bag name="Roles" table="UserRoles" cascade="all" lazy="true" access="nosetter.camelcase-underscore" >
      <key column="UserId"/>
      <many-to-many class="Role" column="RoleId" />
    </bag>
  </class>





</hibernate-mapping>


       <?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
auto-import="true" assembly="EStudy.Business" namespace="EStudy.Business.Entities">
  <class name="EStudy.Business.Entities.Role, EStudy.Business" lazy="false" table="Roles">
    <id name="Id" access="property" column="RoleId">
      <generator class="native" />
    </id>

    <property name="RoleName" access="property" column="RoleName"/>

    <bag name="Users" table="UserRoles" access="nosetter.camelcase-underscore" cascade="all" inverse="true">
      <key column="RoleId"/>
      <many-to-many class="EStudy.Business.Entities.User, EStudy.Business" column="UserId"/>
    </bag>
  </class>

</hibernate-mapping>
    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Linq;
    using System.Text;

    namespace EStudy.Business.Entities
    {
        public class User
        {
            public User() { } 

            public void AddRole(RoleType roleType)
            {
                AddRole(new Role() { RoleName = roleType.ToString() } );
            }

            private IList<Role> _roles = new List<Role>();

            public virtual int Id { get; set; }
            public virtual string UserName { get; set; }
            public virtual string Password { get; set; }
            public virtual string FirstName { get; set; }
            public virtual string LastName { get; set; }
            public virtual DateTime DateCreated { get; set; }
            public virtual DateTime DateModified { get; set; }


            public virtual IList<Role> Roles
            {
                get { return new ReadOnlyCollection<Role>(_roles); }
            }

            protected virtual void AddRole(Role role)
            {
                _roles.Add(role);
                role.AddUser(this);

            }
        }
    }

    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Linq;
    using System.Text;


    namespace EStudy.Business.Entities
    {
        public class Teacher : User
        {
            public Teacher() 
            {

            }
        }

    }

   using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;

namespace EStudy.Business.Entities
{
    public enum RoleType
    {
        Teacher,
        Student,
        Admin
    } ; 

    public class Role
    {
        private IList<User> _users = new List<User>();

        public virtual int Id { get; set; }
        public virtual string RoleName { get; set; }
        public virtual RoleType RoleType { get; set;}

        public void AddUser(User user)
        {
            _users.Add(user);
        }

        public virtual IList<User> Users
        {
            get { return _users;  }
        }

    }

}

使用制度;
使用System.Collections.Generic;
使用System.Collections.ObjectModel;
使用System.Linq;
使用系统文本;
命名空间EStudy.Business.Entities
{
公共类用户
{
公共用户(){}
public void AddRole(RoleType RoleType)
{
AddRole(新角色(){RoleName=roleType.ToString()});
}
私有IList_角色=新列表();
公共虚拟整数Id{get;set;}
公共虚拟字符串用户名{get;set;}
公共虚拟字符串密码{get;set;}
公共虚拟字符串FirstName{get;set;}
公共虚拟字符串LastName{get;set;}
公共虚拟日期时间DateCreated{get;set;}
公共虚拟日期时间日期修改{get;set;}
公共虚拟IList角色
{
获取{返回新的ReadOnlyCollection(_角色);}
}
受保护的虚拟void AddRole(角色)
{
_角色。添加(角色);
role.AddUser(此);
}
}
}
使用制度;
使用System.Collections.Generic;
使用System.Collections.ObjectModel;
使用System.Linq;
使用系统文本;
命名空间EStudy.Business.Entities
{
公共课堂教师:用户
{
公共教师()
{
}
}
}
使用制度;
使用System.Collections.Generic;
使用System.Collections.ObjectModel;
使用System.Linq;
使用系统文本;
命名空间EStudy.Business.Entities
{
公共枚举角色类型
{
老师,,
学生,
管理
} ; 
公共阶级角色
{
私有IList_用户=新列表();
公共虚拟整数Id{get;set;}
公共虚拟字符串RoleName{get;set;}
公共虚拟角色类型角色类型{get;set;}
public void AddUser(用户)
{
_用户。添加(用户);
}
公共虚拟IList用户
{
获取{return\u users;}
}
}
}

上面的映射文件名为User.hbm.xml,它包含用户和角色的映射以及它们与Userrole表的关系

您缺少cascade=“全部删除孤立项”。查看NH文档。

解决方案是在事务中插入。

问题是为什么需要事务?