2009-11-02 3 views
3

J'ai un problème avec une installation assez simple dans NHibernate. (J'utilise Fluent Nhibernate)NHibernate supprimer plusieurs-à-plusieurs causant la violation de clé étrangère

J'ai deux objets comme suit, configuration avec un mappage plusieurs-à-plusieurs bidirectionnel.

Projet

- Catégories (IList)

Catégorie

- Projets (IList) - Inverse = True

Ce modèle comme prévu dans la db.

Si j'essaie de supprimer un projet, NHibernate effectue la suppression dans la table plusieurs-à-plusieurs, puis supprime le projet comme prévu. Cependant, si j'essaie de supprimer une catégorie, NHibernate lève une exception qui viole une contrainte de clé étrangère.

J'ai expérimenté avec inverse = "vrai" des deux côtés mais l'exception est levée soit lorsque j'essaie de supprimer un Projet ou une Catégorie (selon où inverse = "vrai" est). Si j'enlève l'inverse = "true" des deux côtés la suppression fonctionne comme prévu à chaque extrémité. Mais cela entraîne des entrées doubles lors de l'enregistrement et de la mise à jour. Est-ce que quelqu'un peut me dire où je me trompe?

Répondre

3

Est-il possible que vous ne synchronisiez pas l'ensemble de votre graphique d'objets? Le schéma que vous montrez suggère que Project a une collection de catégories et que Category a une collection de projets. Hibernate attend de vous que les associations soient synchronisées dans votre graphe d'objets. Pour supprimer une catégorie (par exemple), essayez d'abord d'effacer sa collection de projets et de supprimer cette catégorie des collections "catégories" des projets auxquels elle était associée.

+0

Je n'efface pas explicitement la collection avant la synchronisation. Bien que cela puisse fonctionner je ne suis pas sûr pourquoi je devrais faire cela à une extrémité de la relation et pas à l'autre. Je devrais sûrement pouvoir supprimer le projet, et NHib effacera toutes les colonnes plusieurs-à-plusieurs liées à ce projet. Les objets ne sont pas étroitement liés, il est possible d'avoir des projets et des catégories qui existent sans relations plusieurs-à-plusieurs. – WDuffy

+0

Le SQL sous-jacent n'a pas de concept de propriétaire de la relation. Si vous avez une association à deux faces, Hibernate n'a besoin que d'informations d'un côté. Je * pense * que l'implémentation de Hibernate ignore le côté marqué par inverse = "true" lors de la sauvegarde/mise à jour - cela expliquerait pourquoi cela fonctionne dans un sens et pas dans l'autre. Pensez à ce que vous faites en supprimant les entrées de la table de mappage avant de supprimer l'objet. Essayez-le en tout cas, et voyez si cela résout votre problème. – RMorrisey

+0

Merci pour l'aide RMorrisey. Est-ce que cela signifie que je devrais évaluer et effacer toutes les relations manuellement dans ma logique d'entreprise avant de commettre des mises à jour NHIb? Je ne peux pas utiliser Cascase All/Delete etc dans les relations many-to-many car il supprime tout quand il pourrait avoir d'autres relations. Je n'ai pas encore eu l'occasion de l'essayer (trop de travail!). – WDuffy

Questions connexes