Comment puis-je Insérer ou mettre à Jour (ou remplacer) un enregistrement à l'aide de NHibernate?

J'ai besoin d'écrire une ligne à la base de données, indépendamment de savoir si elle existe déjà ou pas. Avant d'utiliser NHibernate cela a été fait avec une procédure stockée. La procédure de tenter une mise à jour et si pas de lignes ont été modifiées, il serait de revenir à une insertion. Cela a bien fonctionné car l'application ne prend pas en charge si l'enregistrement existe.

Avec NHibernate, les solutions que j'ai trouvé exiger que le chargement de l'entité et de la modifier, ou la suppression de l'entité, de sorte que la nouvelle peut être inséré. La demande de soins si l'enregistrement existe déjà. Est-il un moyen de contourner cela?

Ne l'Id de la Matière?

Attribué Id

L'objet a un mot-clé attribué l'id et la clé primaire de la table.

Je comprends que SaveOrUpdate() va appeler la méthode Save() ou la méthode Update (), comme approprié en fonction de l'Id. À l'aide d'un id attribué, cela ne fonctionne pas parce que l'id n'est pas une unsaved-value. Cependant une Version ou un champ d'Horodatage peut être utilisé comme un indicateur de la place. En réalité, ce n'est pas pertinente, car cela ne reflète que l'objet dans la mémoire a été associée à un enregistrement dans la base de données; il n'indique pas si le document existe ou pas dans la base de données.

Id Généré

Si l'id attribué était vraiment la cause du problème, je pourrais utiliser un id généré à la place du mot-clé comme clé primaire. Cela permettrait d'éviter le NHibernate Insérer/mettre à Jour la question serait effectivement toujours insérer. Cependant, j'ai encore besoin de prévenir la répétition de mots clés. Avec un index unique sur la colonne de mot clé, il va encore lever une exception pour un duplicata de clé, même si la clé primaire est différente.

Une Autre Approche?

Peut-être que le problème n'est pas vraiment avec NHibernate, mais la manière dont c'est modélisée. Contrairement à d'autres zones de l'application, ce qui est plus centrée sur les données, plutôt de l'objet central. C'est bien que NHibernate le rend facile à lire/écrire et élimine les procédures stockées. Mais le désir d'écrire tout simplement, sans égard aux valeurs existantes ne rentre pas bien avec le modèle d'un objet du modèle d'identité. Est-il une meilleure façon d'aborder cette question?

donc, vous savez, saveOrUpdate() ne fait que vous essayez de charger l'objet d'oracle. Je ne sais pas pourquoi il ne fonctionne pas avec votre id attribué par opposition à généré, mais aussi longtemps que vous faites tout dans une session, il ne vous coûtera pas le temps.
Lorsque l'objet n'existe pas dans la base de données, j'ai une erreur disant qu'il ne pouvait pas mettre à jour l'objet. Une recherche sur Google activée, les références au fait que les SaveOrUpdate() ne fonctionne pas avec un id attribué.
J'ai mis à jour la question pour expliquer le problème en détail et mon meilleure compréhension de NHibernate

OriginalL'auteur g . | 2008-11-28