NHibernate mappage un-à-un où les données de la deuxième table peuvent être nulles
J'ai une base de données existante avec la table des Transactions. J'ai ajouté une nouvelle table appelée TransactionSequence où chaque transaction aura finalement qu'un seul enregistrement. Nous sommes à l'aide de la séquence de la table de comptage des transactions pour un compte donné. J'ai mappé cela comme un one-to-one mapping où TransactionSequence a une clé primaire de TransactionId.
La contrainte est qu'il y a un déclencheur instead of sur la table de transactions ne permet pas les mises à jour de l'annulation ou de transactions comptabilisées.
Ainsi, lorsque la séquence est calculée et l'enregistrement de la transaction, NHibernate essaie d'envoyer une mise à jour sur la transaction comme " mise à JOUR de l'ENSEMBLE de Transactions TransactionId = ? OÙ TransactionId = ?'. Mais cela échoue en raison de la gâchette. Comment puis-je configurer ma cartographie de sorte que NHibernate ne vais pas essayer de mettre à jour la table de Transactions lorsqu'un nouveau TransactionSequence tableau est inséré?
Opération de cartographie:
<class name="Transaction" table="Transaction" dynamic-update="true" select-before-update="true">
<id name="Id" column="ID">
<generator class="native" />
</id>
<property name="TransactionTypeId" access="field.camelcase-underscore" />
<property name="TransactionStatusId" column="DebitDebitStatus" access="field.camelcase-underscore" />
<one-to-one name="Sequence" class="TransactionSequence" fetch="join"
lazy="false" constrained="false">
</one-to-one>
</class>
Et la séquence de la cartographie:
<class name="TransactionSequence" table="TransactionSequence" dynamic-update="true">
<id name="TransactionId" column="TransactionID" type="Int32">
<generator class="foreign">
<param name="property">Transaction</param>
</generator>
</id>
<version name="Version" column="Version" unsaved-value="-1" access="field.camelcase-underscore" />
<property name="SequenceNumber" not-null="true" />
<one-to-one name="Transaction"
class="Transaction"
constrained="true"
foreign-key="fk_Transaction_Sequence" />
</class>
Toute aide serait grandement apprécié...
source d'informationauteur SteveBering
Vous devez vous connecter pour publier un commentaire.
Association dans nhibernate ne fonctionne pas de la manière que vous pensez qu'il fait. Il est conçu de sorte que vous avez deux classes, qui, lorsqu'il a persisté à leurs tables correspondantes ont les mêmes clés primaires.
Cependant, vous pouvez le faire fonctionner, mais il n'est pas assez. Je vais vous montrer comment puis offrir des solutions de rechange:
Dans votre Transaction hbml:
Dans votre Séquence de code html:
Ce devrait faire ce que vous voulez qu'il fasse. Notez le bien-réf.
La question suivante, vous allez poster sur va demander comment vous obtenez le chargement paresseux sur un-à-un les associations. La réponse est, vous ne pouvez pas... eh bien, vous pouvez, mais il ne sera probablement pas travailler. Le problème est que vous avez votre clé étrangère sur la séquence de la table, ce qui signifie que nhibernate doit frapper la base de données pour voir si la cible existe. Ensuite, vous pouvez essayer de jouer avec les contraintes="true/false" pour voir si vous pouvez les amener à abandonner la charge de l'un-à-un association.
Dans l'ensemble, il va entraîner une perte totale de votre temps.
Je suggère:
Cela va vous faire économiser beaucoup de maux de tête dans le long terme.
S'avère que pour ma situation un
<join table>
de cartographie qui a le mieux fonctionné. J'ai juste eu à assurez-vous que j'ai fait la propriétés à partir de la deuxième table, il y avait des types nullables, ou de faire une insertion sur enregistrer, même si rien n'avait changé. Depuis je n'ai pas besoin d'un chargement différé pour la seconde table, cela fonctionne très bien. Je suis sûr que je pouvais avoir obtenu jumelé plusieurs-à-un les mappages de travail, mais il n'était pas intuitive et semble plus compliqué que la table de jointure option, cependant<join table>
n'est disponible que dans NHibernate de la version 2.0.