2009-08-18 9 views
0

Je rencontre des problèmes pour mapper la relation plusieurs à plusieurs! J'ai une table Users, une table Roles et une table UserRoles. Un utilisateur peut avoir plusieurs rôles. La table Roles stocke simplement le nom des rôles tels que Admin, Editor, etc. La table Userroles stocke la relation de l'utilisateur avec les rôles.NHibernate Mapping relation plusieurs-à-plusieurs

Lorsque je sauvegarde l'utilisateur, les informations utilisateur sont enregistrées mais les informations de rôle ne sont pas enregistrées.

Voici mes applications:

 <?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; } 
     } 

    } 

} 

Le fichier de mappage ci-dessus est appelé User.hbm.xml et il contient le mappage pour l'utilisateur et le rôle et leur relation avec la table UserRole.

Répondre

1

La solution consiste à effectuer l'insertion en transaction.

+0

La question est de savoir pourquoi cela nécessite une transaction? – azamsharp

1

Il vous manque cascade = "all-delete-orphan". Vérifiez la documentation NH.

+0

Les fichiers de mappage ont été mis à jour dans la question ci-dessus! – azamsharp

Questions connexes