2010-03-17 3 views
2

J'ai un objet avec un mappage Nhibernate qui a un ID de substitution et un ID natual. Étant donné que l'identification naturelle est contrainte de manière unique, une requête d'insertion échouera si l'objet est déjà dans la base de données avec le même ID naturel. Ma solution pour cela a été de vérifier manuellement si les ID naturels sont dans la base de données avant d'essayer d'insérer.Contrainte unique Nhibernate

Existe-t-il un moyen de spécifier Nhibernate pour faire une sélection avant l'insertion sur des contraintes naturelles Id/uniques?

Répondre

1

D'une manière ou d'une autre, vous devrez vous rendre à la base de données. Toutefois, vous pouvez le faire de manière plus transparente avec NH Validator.

Lire l'article suivant de Fabio Maulo: http://fabiomaulo.blogspot.com/2009/10/validation-through-persistence-not.html

+0

Comment les valideurs m'aident-ils? – Will

+0

Le lien que Diego a posté est un exemple d'utilisation de NH Validator pour interroger la base de données afin de s'assurer que l'identifiant naturel de BlogPost (Titre et Date) n'est pas violé. Cela ferait exactement ce que vous demandiez - avant de tenter de sauvegarder l'entité, NHibernate vérifierait les validations, ce qui provoquerait l'exécution d'une requête select. –

0

je résous généralement ce genre de scénario en essayant simplement d'insérer (soumettre les modifications) et attrapant l'exception résultant.

De toute façon, vous devrez cliquer sur la base de données, donc un INSERT défectueux aura le même coût (sinon moins cher) qu'un SELECT ... Et c'est plus sûr.

+0

Le problème vient lorsque ces objets font partie d'une construction en cascade. L'objet unique dont je ne me soucie pas vraiment s'il est mis à jour ou inséré interrompt la transaction pour la construction entière. – Will

+0

C'est pourquoi vous devriez faire les deux! – dariol

0

Je vérifie l'unicité avant l'enregistrement ou la mise à jour. Ensuite, je peux afficher un bon message de validation. J'ai trouvé difficile de lire l'exception et de faire correspondre la violation de contrainte au champ correct. Peut-être que NH a résumé les codes d'erreur pour les bases de données supportées ... Je n'ai pas examiné cela. Dans les rares cas où la contrainte est violée entre la vérification et l'enregistrement, l'utilisateur reçoit un message d'erreur général.

1

J'ai fini par construire un écouteur SaveOrUpdate pour Nhibernate afin que les objets soient sur le point d'être sauvegardés dans la base de données. Je peux déterminer si leur unicité doit être vérifiée. Au lieu de simplement sélectionner pour voir si les propriétés uniques de l'objet existent dans la base de données, je fais une sélection pour la mise à jour (verrou pessimiste) afin que la ligne soit verrouillée pour pouvoir fusionner et mettre à jour l'objet en toute sécurité. Le fait crée des requêtes O (2N) mais si cela devient un problème je pourrais le simplifier en une seule instruction de fusion.

http://en.wikipedia.org/wiki/Merge_(SQL)

+0

Ce serait vraiment génial si vous pouviez partager comment vous avez fait cela. Je suis dans la même situation et je me bats pour mettre en place un tel auditeur – flipchart

Questions connexes