NHibernate LazyInitializationException .. Wie zu verhindern?

8

Ich erhalte den folgenden Fehler auf unserem Produktions-Webserver:

%Vor%

was nicht gut ist. Die einzige Möglichkeit, die Anwendung wieder zum Laufen zu bringen, ist das Zurücksetzen von IIS, was eigentlich keine Option ist. Was bedeutet das? Wie kann ich das verhindern?

    
DaveDev 08.12.2010, 15:05
quelle

4 Antworten

9

Standardmäßig sind Beziehungen faul. Das bedeutet, dass die SQL-Abfrage zum Laden der Beziehung nur ausgeführt wird, wenn Sie auf die Eigenschaft zugreifen, die die Beziehung enthält.

Das Problem ist, dass wenn Sie auf eine faule Eigenschaft zugreifen, die noch nie zuvor aufgerufen wurde, und die Sitzung geschlossen ist, dann erhalten Sie diesen Fehler. Sie müssen Lösungen:

  • Schließen Sie die Sitzung nicht, bis Sie fertig sind
  • Vor dem Schließen der Sitzung greifen Sie auf alle faulen Eigenschaften zu, die später verwendet werden.
lujop 08.12.2010, 15:12
quelle
8

Um dieses Problem zu vermeiden, müssen Sie den Verweis für PeerGroups in Ihrer Region-Mapping-Klasse wie folgt ändern

%Vor%

Das Hinzufügen von Fetch.Join () verhindert LazyInitializationException.

    
Arkadas Kilic 24.04.2014 15:53
quelle
2

Schließen Sie die Sitzung nicht, bis Sie mit dem Objekt fertig sind.

Dies ist eine der größten Herausforderungen beim Arbeiten mit NHIbernate IMHO: Definieren der Sitzungsgrenzen.

In einer ASP.NET-Anwendung ist es ziemlich einfach: Die Sitzung beginnt am Anfang der Anfrage, und Sie können die Sitzung am Ende der Anfrage schließen.

In einer WinForms-App ist es etwas schwieriger: Sie müssen die Grenzen des Beginns einer Sitzung und des Schließens der Sitzung klar definieren. In WinForms-Anwendungen definiere ich normalerweise "Aufgaben", die eine Art von Arbeitseinheit darstellen. Jede Aufgabe hat eine Sitzung. Die Sitzung wird erstellt / geöffnet, wenn eine Aufgabe erstellt wird, und geschlossen, wenn die Aufgabe beendet ist.

Daneben können Sie auch einige Verknüpfungen als nicht faul definieren. Sie sollten jedoch sicherstellen, dass die Leistung nicht beeinträchtigt wird, wenn Sie dies tun.

    
Frederik Gheysels 08.12.2010 15:17
quelle
0

Nach den Antworten von Frederik und Lujop ist es eine gute Idee, ein Dependency-Framework (wie Castle Windor) zu verwenden, wenn Sie an einer ASP.NET-App arbeiten (wie von Ihrer Erwähnung eines Webservers vorgeschlagen) der Lebenszyklus Ihrer ISessions. Castle Windsor hat eine Lifestyle-Einstellung von "PerWebRequest", die das für Sie erledigt.

Falls dies nicht der Fall ist, erstellen Sie manuell eine ISession zu Beginn jeder Anfrage, die am Ende der Anfrage zerstört wird (möglicherweise wird sie automatisch gelöscht). Dann kann Ihre App diese ISession verwenden.

Dies hat definitiv damit zu tun, dass eine ISession geschlossen wird, bevor Sie es für richtig halten.

    
David 08.12.2010 15:30
quelle

Tags und Links