2009-12-03 7 views
4

J'ai une table Users et une table Networks avec une relation many-to-many entre elles (un utilisateur peut être long sur plusieurs réseaux et un réseau peut contenir plusieurs utilisateurs). La relation plusieurs-à-plusieurs est contenue dans une table "UserNetworks" qui a simplement deux colonnes, UserId et NetworkId.NHibernate Many-To-Many supprime toutes les associations avant l'insertion

Mes cours se présentent comme suit:

public class User 
{ 
    public IList<Network> Networks {get; set;} 
} 

public class Network 
{ 
    public IList<Usre> Users {get; set;} 
} 

Les correspondances NHibernate pour ces nombreux à plusieurs collections ressemble à ceci:

User.hbm.xml:

<bag name="Networks" table="UserNetworks" cascade="save-update" inverse="true"> 
    <key column="UserId" /> 
    <many-to-many class="Network" column="NetworkId" /> 
</bag> 

réseau .hbm.xml:

<bag name="Users" table="UserNetworks" cascade="save-update"> 
    <key column="NetworkId" /> 
    <many-to-many class="User" column="UserId" /> 
</bag> 

Dans mon code, je crée une association entre un utilisateur et un réseau comme ceci:

user.Networks.Add(network); 
network.Users.Add(user); 

je me attends à la course SQL pour effectuer simplement un INSERT à la table UserNetworks. Au lieu de cela, il exécute un DELETE sur la table UserNetworks avec NetworkID = X, puis réinsère toutes les lignes UserNetworks avec la nouvelle association.

Qu'est-ce que je fais mal?

Répondre

5

Le comportement est voulu. Voir, NH ne sait pas ce qui est courant/nouveau/supprimé dans la liste. Donc, en supprimant tout et en insérant quoi que ce soit dans la liste aura du sens.

+2

Voici le texte du manuel (section 15.5.1) ... » Les sacs sont le pire des cas. Comme un sac permet la duplications des éléments et n'a pas de colonne d'index, aucune clé primaire peuvent être définies. NHibernate a aucun moyen de faire la distinction entre les lignes en double NHibernate résout ce problème en supprimant complètement (en un seul DELETE) et en recréant la collection à chaque fois qu'elle change, ce qui peut être très inefficace. –

+0

Parfait. J'ai ajouté une colonne d'identité à ma table UserNetworks et j'ai basculé vers un IdBag et cela a très bien fonctionné. Merci! –

+0

Fantastique! C'est ce que j'ai fait pour mes projets aussi. :) –

Questions connexes