Pergunta

Isto é, em um ambiente de aplicativo web:

Um pedido inicial é capaz de concluir com êxito, no entanto quaisquer pedidos adicionais retornar uma "sessão é fechada" resposta do quadro NHibernate. Eu estou usando uma abordagem HttpModule com o seguinte código:

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 é minha implementação singleton, usando FluentNHibernate para retornar um objeto ISessionFactory.

Na minha classe de repositório, eu tentar usar a seguinte sintaxe:

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

Isso permite que código no aplicativo a ser chamado como tal:

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

Eu tenho uma suspeita meu código repositório é a culpa, mas eu não estou 100% certo sobre a aplicação efectiva eu ??deveria estar usando.

Eu encontrei um problema semelhante no SO aqui . Eu também estou usando WebSessionContext na minha implementação, no entanto, nenhuma solução foi dada diferente de escrever um SessionManager personalizado. Para as operações de CRUD simples, é uma provedora de sessão personalizado exigido para além do construído em ferramentas (ou seja WebSessionContext)?

Foi útil?

Solução

Eu não testei seu código, mas de leitura, esta linha:

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

é dumping sua sessão após a saída do bloco, em seguida, a sessão está disposto / inválida na próxima vez que passar.

Aqui está o modelo que estamos usando em nossas aplicações:

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();
}

Outras dicas

Eu tenho um erro semelhante. Acontece que eu estava "novo" ing-se meu repositório em vez de ter o meu recipiente determinação IOC-lo.

Use um dos seguintes dispõe declaração fora ou fecha a sessão depois de cada consulta:

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

Em vez disso usá-lo sem a "utilizar" palavra como:

ISession session = SessionFactory.Instance.GetCurrentSession()

Isso funcionou para mim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top