2012-04-05 7 views
0

Ich habe ein Problem mit NHibernate ISession. Wenn ich versuche, etwas in der Datenbank falsch zu machen (z. B. Speichern einer Entität mit doppeltem Schlüssel in XYZ-Spalte) und Rollback Transaction; ISession Instanz geht in einen BROKEN/INVALID-Zustand, der danach keinen Datensatz mehr speichert, und jedes Mal, wenn NHibernat eine weitere Ausnahme auslöst, die mich über das erste Mal informiert.NHibernate ISession: Nichts kann nach einer Ausnahme beibehalten werden

Ich habe ISession Methoden wie Flush, Clear, Close verwendet, aber mein Problem existiert. Ein anderer Ansatz besteht darin, eine weitere ISession Instanz von anzufordern, aber wenn ich dies benutze, ein anderes seltsames Problem: illegal attempt to associate a collection with two open sessions.

Wie kann ich eine ISession-Instanz wiederherstellen, ohne erneut eine andere von anzufordern?

Vielen Dank im Voraus :)

+0

Haben Sie eine Lazyload-Eigenschaft für dieses Modell? –

+0

Ja! Viele Lazy geladenen Eigenschaften (Navigation, Sammlungen) – Sadegh

+0

Wenn Sie einige der Eigenschaften anfordern, könnte ein Problem sein. –

Antwort

1

Sie können nicht die ISession erholen. Von documentation:

Wenn die ISession eine Ausnahme auslöst, sollten Sie sofort die Transaktion Rollback, rufen ISession.Close() und die ISession Instanz verwerfen. Bestimmte Methoden von ISession werden die Sitzung nicht in einem konsistenten Zustand verlassen.

Auch creating ISession is cheap also gibt es keinen Grund zu versuchen, es wiederzuverwenden. Wahrscheinlich möchten Sie ISession pro Anfrage haben, wenn Sie eine MVC-Anwendung haben.

1

Sie können nicht, und Sie sollten nicht.

Wenn eine Transaktion fehlschlägt, müssen Sie die Anfrage abbrechen und einen Fehler anzeigen.

Die logische Folge ist, dass Sitzungsausnahmen nicht Teil Ihres normalen Ablaufs sein sollten.

Jetzt, da Sie MVC verwenden, hier ist ein Beispiel dafür, wie die Fehlerbehandlung funktionieren könnte, wenn Sie Fehler erlauben:

public ActionResult CreateFoo(FooModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     try 
     { 
      SaveThe(model); 
      TheTransaction.Commit(); 
      return RedirectToAction("Whatever"); 
     } 
     catch (WhateverTheDuplicateKeyExceptionIs) 
     { 
      ModelState.AddModelError("", "Duplicate XYZ"); 
     } 
    } 
    return View(); 
} 
Verwandte Themen