J'ai un scénario où je dois faire ce qui suit dans une transaction: 1. Enregistrer un modèle avec une clé unique 2. Supprimez ce modèle 3. Enregistrer un nouveau modèle avec la même clé unique que le premier avait.NHibernate Enregistrer, Supprimer, Enregistrer donne violation clé unique
Je m'attendrais à ce que cela fonctionne très bien, mais je reçois une violation de clé unique. NH Profiler montre également que l'instruction delete n'est pas émise avant la deuxième insertion.
Ma cartographie se présente comme suit:
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHTest"> <class name="UniqueKeyModel" table="UniqueKeyModels"> <id name="Id"> <generator class="hilo"/> </id> <property name="TheVal" unique-key="valuniqueness" type="System.String"></property> </class> </hibernate-mapping>
Mon modèle:
public class UniqueKeyModel { public virtual long Id { get; private set; } public virtual string TheVal { get; set; } }
Mon Testcase:
ISession sess = ...; UniqueKeyModel mFirst = new UniqueKeyModel { TheVal = "value" }; sess.Save(mFirst); sess.Delete(mFirst); UniqueKeyModel mSecond = new UniqueKeyModel { TheVal = "value" }; sess.Save(mSecond);
Merci. Un Flush() après Delete() semble résoudre ce problème. J'ai oublié d'indiquer que j'utilisais des transactions. par exemple. en utilisant (ISess ...) en utilisant (ITansaction t = sess.BeginTransaction() ...). La session.flush ne semble pas fermer la transaction, car je peux annuler la transaction entière après un .Flush. –
Merci pour votre conseil (dans notre application, nous fermons la transaction avec le flush) - J'ai corrigé ma réponse ... – bernhardrusch