2009-06-25 12 views
0

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); 

Répondre

0

Je pense que vous devriez rincer la session après la suppression. Les modifications sont écrites dans la base de données lorsque vous videz une session. (Si vous utilisez des transactions, vous devez en démarrer une nouvelle après avoir vidé la session)

+0

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. –

+0

Merci pour votre conseil (dans notre application, nous fermons la transaction avec le flush) - J'ai corrigé ma réponse ... – bernhardrusch