2010-10-07 3 views
1

Je ces 2 objets NHibernate formant une relation plusieurs à plusieurs:Retirer d'un côté des nombreux à beaucoup dans Nhibernate

utilisateur:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="Providers" namespace="Providers.Objects"> 

    <class name="User" table="Users"> 

    <id name="UserId" type="int"> 
     <generator class="native" /> 
    </id> 

    <many-to-one name="Application" column="ApplicationId" cascade="none" />  

    <property name="UserName" type="string" /> 
    <property name="LoweredUserName" type="string" /> 
    <property name="MobileAlias" type="string" /> 
    <property name="IsAnonymous" type="bool" /> 
    <property name="LastActivityDate" type="DateTime" /> 

    <bag name="Roles" table="UsersInRoles" lazy="true" cascade="none" > 
     <key column="UserId"></key> 
     <many-to-many class="Role" column="RoleId"></many-to-many> 
    </bag> 

    </class> 

</hibernate-mapping> 

Et Rôle:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="Providers" namespace="Providers.Objects"> 

    <class name="Role" table="Roles"> 

    <id name="RoleId" type="int"> 
     <generator class="native" /> 
    </id> 

    <many-to-one name="Application" column="ApplicationId" class="Application" cascade="none" />  

    <property name="RoleName" type="string" /> 
    <property name="LoweredRoleName" type="string" /> 
    <property name="Description" type="string" /> 

    <bag name="Users" table="UsersInRoles" lazy="true" inverse="true" cascade="none" > 
     <key column="RoleId"></key> 
     <many-to-many class="User" column="UserId"></many-to-many> 
    </bag> 

    </class> 

</hibernate-mapping> 

Supposons que le rôle backupoperator comporte des utilisateurs. Si je tente de supprimer l'un des utilisateurs de l'instance de rôle, comme:

var backupoperator = GetRoleByName(session, app.ApplicationId, "backupoperator"); 
backupoperator.Users.RemoveAt(0); 
session.Update(backupoperator); 
transaction.Commit(); 

Il ne fonctionne pas :(L'association reste inchangée dans la base de données Lorsque je tente le contraire (supprimer un rôle d'un utilisateur. objet et mise à jour de l'objet utilisateur), cela fonctionne Est-ce dû à l'attribut inverse dans le mappage NHibernate?

Comment accomplir ce que j'essaie de faire? (supprimer un utilisateur d'un rôle, mettre à jour le rôle et ayant cela persisté)?

Merci

Répondre

2

Lorsque vous écrivez inverse="true" vous dites à NHibernate que le autre côté maintient la relation.

Par conséquent, vous devez supprimer le rôle de rôles de l'utilisateur collection si vous voulez que votre changement a persisté.

+0

Merci Diego, savez-vous ce que serait la commande HQL pour supprimer un rôle et supprimer toutes ses associations (ne pas supprimer les utilisateurs, mais supprimer les associations avec les utilisateurs)? J'ai du mal à trouver ça. Si je parcourt tous les utilisateurs et que j'appelle session.Supprimer sur chaque utilisateur, je vais avoir plusieurs allers-retours à la base de données (peut-être des centaines dans certains cas). – qwerty2010

+0

Vous n'aurez pas autant d'allers-retours si vous utilisez le traitement par lots, voir http://nhforge.org/doc/nh/fr/index.html#performance-batch-updates –

+0

Génial, merci de m'avoir informé. – qwerty2010

Questions connexes