Frage

Dies ist in einer Web-Anwendungsumgebung:

Eine erste Anforderung in der Lage, erfolgreich abgeschlossen, jedoch keine zusätzlichen Anforderungen eine Rückkehr „Session ist beendet“ Antwort vom NHibernate Rahmen. Ich bin mit einem Httpmodule Ansatz mit dem folgenden Code:

public class MyHttpModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.EndRequest += ApplicationEndRequest;
        context.BeginRequest += ApplicationBeginRequest;
    }

    public void ApplicationBeginRequest(object sender, EventArgs e)
    {
        CurrentSessionContext.Bind(SessionFactory.Instance.OpenSession());
    }

    public void ApplicationEndRequest(object sender, EventArgs e)
    {
        ISession currentSession = CurrentSessionContext.Unbind(
            SessionFactory.Instance);

        currentSession.Dispose();
    }

    public void Dispose() { }
}

SessionFactory.Instance ist meine Singleton Implementierung mit FluentNHibernate ein ISessionFactory Objekt zurück.

In meiner Repository-Klasse, ich versuche, die folgende Syntax zu verwenden:

public class MyObjectRepository : IMyObjectRepository
{
    public MyObject GetByID(int id)
    {
        using (ISession session = SessionFactory.Instance.GetCurrentSession())
            return session.Get<MyObject>(id);
    }
}

Dies ermöglicht Code in der Anwendung als solche genannt werden:

IMyObjectRepository repo = new MyObjectRepository();
MyObject obj = repo.GetByID(1);

Ich habe den Verdacht, mein Repository Code schuld ist, aber ich bin nicht 100% sicher über die tatsächliche Umsetzung soll ich verwenden.

fand ich ein ähnliches Problem auf SO hier . Ich bin zu WebSessionContext in meiner Implementierung unter Verwendung wurde jedoch keine andere Lösung zur Verfügung gestellt, als ein benutzerdefinierten Sessionmanager zu schreiben. Für einfache CRUD-Operationen sind, benötigten ein eigene Session-Provider abgesehen von der in Werkzeugen gebaut (dh WebSessionContext)?

War es hilfreich?

Lösung

Ich habe den Code nicht getestet, aber aus dem Lesen dieser Zeile:

using (ISession session = SessionFactory.Instance.GetCurrentSession())

wird die Sitzung nach den Block beendet Dumping, und dann wird die Sitzung / ungültig auf der nächsten Zeit durch angeordnet ist.

Hier ist das Modell, das wir in unseren Anwendungen verwenden:

ISession session = null;

try
{
    // Creates a new session, or reconnects a disconnected session
    session = AcquireCurrentSession();

    // Database operations go here
}
catch
{
    session.Close();
    throw;
}
finally
{
    session.Disconnect();
}

Andere Tipps

Ich habe einen ähnlichen Fehler. Stellt sich heraus, ich war „neu“ mein Repository ing up statt mit meinem IOC-Container es lösen.

Mit der folgenden Anweisung verfügt ab oder schließt die Sitzung nach jeder Abfrage:

using (ISession session = SessionFactory.Instance.GetCurrentSession())

Stattdessen es verwenden, ohne das „Verwendung“ Wort als:

ISession session = SessionFactory.Instance.GetCurrentSession()

Das funktioniert für mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top