2010-09-18 42 views
0

J'ai une association many-to-many entre les listes et ListItems: une liste connaît ses éléments, mais un ListItem ne sait pas sur les listes contenant. La cascade est sauveupdate. Donc, chaque fois que j'essaye de supprimer une entité ListItem, j'obtiens une exception SQLException disant que je brise l'intégrité référentielle. NHibernate essaie de supprimer mon ListItem sans supprimer la ligne correspondante dans la table de liaison. La question est, est-il possible d'ordonner à NHibernate de supprimer mon ListItem sans casser l'intégrité référentielle?NHibernate many-to-many et la suppression d'un élément

Dans le cas où je dois supprimer manuellement l'élément de toutes les listes contenant, comment puis-je le faire correctement?

Merci beaucoup pour tout conseil.

Ulu

Répondre

0

Vous devez définir la mise en correspondance sur l'enfant à inverse=true. De another thread:

Lorsque vous appelez saveOrUpdate NHibernate supprime d'abord tous de l'enfant objets. Puis, comme aucune relation n'est marquée comme inverse, NHibernate tente également de définir la colonne de clé étrangère dans votre table enfant à null. Étant donné que les lignes ont déjà été supprimées, vous recevez la deuxième erreur . Vous devez définir inverse = true sur un côté de votre relation pour corriger cela. Ceci est généralement effectué sur le côté (clé primaire ou parent). Si vous ne le faites pas, NHibernate fera les mises à jour appropriées pour chaque côté de la relation.

public class StoreMap : ClassMap<Store> 
{ 
    public StoreMap() 
    { 
    Id(x => x.Id); 
    Map(x => x.Name); 
    HasMany(x => x.Staff) 
     .Inverse()   // Magic code! 
     .Cascade.All(); 
    } 
} 
+0

Fantastique, merci !!! – ulu

+0

Cependant, maintenant ajouter à une liste ne fonctionne pas !!! L'élément lui-même est enregistré dans la base de données, mais je ne peux pas l'ajouter à la liste. J'utilise list.Items.Add (newItem); _session.Save (newItem); _session.Update (liste); – ulu

+0

Comment ajouter à la liste ** ne fonctionne pas? Si vous en avez besoin, mettez à jour votre question afin que nous ayons plus de détails. :) – rebelliard