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?
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. –
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! –
Fantastique! C'est ce que j'ai fait pour mes projets aussi. :) –