2010-11-28 7 views
0

Verwendung von NHibernate mit ASP.NET 4.LazyInitializationException in ASP.NET app mit NHibernate

Ich habe keine Probleme Abrufen von Objekten gehabt, aber ich habe gerade zu einem Punkt mit verschachtelten Objekten, die ich nicht herausfinden können, .

Ich verwende faul = true und wenn eine faule Last Sammlung Zugriff erhalte ich die Meldung:

Initializing[type#3]-failed to lazily initialize a collection of role: [type], no session or session was closed 

Auch wenn ich rufe SessionFactory.OpenSession() unmittelbar vor dem Objekt zugegriffen wird, es macht keinen Unterschied. Ich habe auch versucht, Zugriff auf die Sammlung in einem mit ISession Block zu keinem Glück.

Bearbeiten zum Hinzufügen - Ich habe current_session_context_class = Web in web.config festgelegt, und ich verwende CurrentSessionContext.Bind on BeginRequest.

Kann mir jemand einen Rat geben?

Nicht ein MVC-app

Ich lese diese - nicht wissen, wie genau es ist, und es ist Hibernate: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2878

Es sagt etwas über einen Fehler in many-to-many Beziehungen.

Hier ist meine HBM-Mapping:

<bag name="Objects" table="ObjectInstance" cascade="all" lazy="true"> 
    <key column="branchId" /> 
    <many-to-many class="InventoryObjectInstance" column="objectInstanceId" /> 
</bag> 

Antwort

1

dass Geschieht nachdem Sie einige Speichern/Update-Operationen durchführen? Wo und wann schließen Sie die Sitzung ab? Für mich klingt es so, als ob Sie die Sitzung unmittelbar nach dem Speichern eines Anrufs oder auf eine andere Weise schließen, bevor die Webseite gerendert wird. Mit anderen Worten: Stellen Sie sicher, dass Sie die Sitzung "Öffnen" im Ansichtsmuster verwenden, und schließen Sie die Sitzung erst am Ende der aktuellen Webanfrage. Sie können auch diese post überprüfen.

+0

Cheers Denis. Nein, es gibt keine Speicheroperation, und wie gesagt, selbst wenn ich explizit vor dem Aufruf eine Sitzung erstelle, gibt es immer noch diese Ausnahme. – Sam

+0

Sie sollten die Sitzung b/c nicht erneut öffnen. In diesem Fall ist es eine andere Sitzung, die nicht in den Objekten wiederverwendet werden kann, die OLD-Sitzung erwarten - Sie müssen denselben Sitzungskontext im aktuellen Anforderungslebenszyklus beibehalten. Sie müssen nur diese Codeblöcke finden (Usings, explizite Aufrufe an die .Close() -Methode), die Ihre Sitzung schließen und sie in Global.asax http://www.codeproject.com/KB/architecture/NHibernateBestPractices zu EndRequest verschieben. aspx –

+0

Siehe auch hier - http: // community.jboss.org/wiki/OpenSessioninView –

0

Wenn Objektgraphen abgerufen werden, behalten sie einen Verweis auf die Sitzung, die sie hervorgebracht hat. Sie verwenden diese Sitzung zum verzögerten Laden ihrer Eigenschaften. Wenn die ursprüngliche Sitzung geschlossen ist, erhalten Sie diesen Fehler (oder einen ähnlichen Fehler), wenn Sie versuchen, auf sie zuzugreifen. Das Öffnen einer neuen Sitzung wird nicht helfen.

Sie können versuchen, zu finden, wo die ursprüngliche Anforderungssitzung geschlossen wurde, und diese stoppen. Sind Sie in der gleichen Anfrage? Andernfalls können Sie versuchen, Ihr Objekt mit einer neuen Sitzung zu verbinden - ich denke, es ist Session.Lock(YourObject). Alternativ könnten Sie das Objekt erneut aus der neuen Sitzung abrufen.

+0

Immer noch in der gleichen Sitzung, und ich habe Pause den ganzen Code, wo die Sitzung geschlossen ist und nicht ausgelöst werden. – Sam

0

Aus irgendeinem Grund erhalten Sie eine neue ISession, wenn Sie SessionFactory.OpenSession() aufrufen. Ist Ihre erste Verwendung der Sitzung, die den Zugriff darauf in einem using-Block umschließt? Warum rufst du OpenSession noch einmal an - was ist mit dem Verweis auf die Sitzung passiert?

Verwandte Themen