2010-02-25 3 views
6

Ich fange die GenericADOException mit InnerException.Message = "Eindeutige Schlüsselverletzung ...", für dem Benutzer mitteilen, dass die eingegebene Anmeldung bereits verwendet wird.
nach, dass ich versuche etwas date (Session.CreateCriteria) i diesen Fehler zu erhalten: null ID in "MyEntityType" -Eintrag (Sie die Session nicht spülen, nachdem eine Ausnahme auftritt)Null-ID in "MyEntityType" -Eintrag (die Sitzung nach einer Ausnahme nicht leeren) beim Versuch, Session.GetAll nach einer GenericADOException

Antwort

7

http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-exceptions

If the ISession throws an exception you should immediately rollback the transaction, call ISession.Close() and discard the ISession instance. Certain methods of ISession will not leave the session in a consistent state.

Haben Sie die Sitzung nach der Ausnahme weggeworfen und eine neue Sitzung gestartet?

+1

wenn ich Session.Clear tun(), nachdem die Ausnahme ausgelöst wurde, als ich werde dieses Problem nicht, aber ich denke nicht, dass es eine gute Idee ist, die Sitzung für die gesamte Webanwendung zu löschen, weil ein einziger Benutzer eine Ausnahme hat – Omu

+1

Sie müssen die Sitzung nach einer Ausnahme schließen. Ich würde vorschlagen, dass Sie Ihre App so umschreiben, dass sie zuerst nach dem Login fragt, bevor Sie versuchen, es einzufügen, damit Sie die gleiche Funktionalität erhalten, ohne dass eine Datenbankausnahme ausgelöst wird. Es scheint, dass Sie aufgrund Ihrer Implementierungsauswahl derzeit eine Ausnahme in einer Ausnahmezustand erhalten. Es ist auch eine bewährte Methode, eine Sitzung pro Webanforderung und keine Sitzung pro Webanwendung zu erstellen. –

1

Sie können das Objekt aus dem Kontext entfernen und weiter, wenn Sie wie folgt vorgehen:

public void Save() { 
    try 
    { 
     Session.SaveOrUpdate(this); 
    } 
    catch 
    { 
     // If the object as a null identifier everything else fails. Remove from context 
     if (Session.GetIdentifier(this) == null) 
     ((SessionImpl)Session).PersistenceContext.EntityEntries.Remove(this); 
     throw; 
    } 
    } 
Verwandte Themen