La session que se usa es diferente para cada petición

Te enseño como lo tenemos configurado

 public class HttpContextSessionStorage: ISessionStorage
    {
        const string CLAVE_SESIONES = "NHibernate.Session.Keys";

        public HttpContextSessionStorage()
        {
        }

        public HttpContextSessionStorage(HttpApplication httpApp)
        {
            if (httpApp != null)
            {
                httpApp.BeginRequest += Application_BeginRequest;
                httpApp.EndRequest += Application_EndRequest;
            }
        }

        public static void Application_BeginRequest(object sender, EventArgs
e)
        {
            HttpContext.Current.Items[CLAVE_SESIONES] = new
Dictionary<string, ISession>();
        }

        public static void Application_EndRequest(object sender, EventArgs
e)
        {
            var sesionesActivas =
HttpContext.Current.Items.Contains(CLAVE_SESIONES) ?
HttpContext.Current.Items[CLAVE_SESIONES] : null;
            if (sesionesActivas != null)
            {
                foreach (var session in ((IDictionary<string,
ISession>)sesionesActivas).Values)
                {
                    if (session.Transaction != null &&
session.Transaction.IsActive)
                    {
                        try
                        {
                            session.Transaction.Commit();
                        }
                        catch
                        {
                            session.Transaction.Rollback();
                        }
                    }
                    session.Close();
                }
            }
        }

        public void SetSession(string database, ISession session)
        {
            var sessions = (IDictionary<string, ISession>)
HttpContext.Current.Items[CLAVE_SESIONES];
            sessions[database] = session;
        }

        public ISession Session(string database)
        {
            var sessions = (IDictionary<string,
ISession>)HttpContext.Current.Items[CLAVE_SESIONES];

            ISession session;
            sessions.TryGetValue(database, out session);

            return session;
        }
    }


//NHbinernateSession

 public static class NHibernateSession
    {


        static readonly IDictionary<string, ISessionFactory> _sessionFactory
= new Dictionary<string, ISessionFactory>();

        // Lo convierto en propiedad porque necesitamos cambiarlo en el
transcurso de la inicialización de la aplicación:
        public static ISessionStorage SessionStorage { get; set; }

        public static void Init(ISessionStorage sessionStorage,
IConfiguracionBD configuracionBD, Assembly assembly)
        {
            SessionStorage = sessionStorage;

            foreach (var conexion in configuracionBD.ListaDatosConexion)
            {
                var configuracionSessionFactory = new Configuration();


 configuracionSessionFactory.SetProperty("connection.connection_string",
conexion.DameConnectionString());
                configuracionSessionFactory.Configure();

                configuracionSessionFactory.AddAssembly(assembly);

                _sessionFactory[conexion.NombreConexion] =
configuracionSessionFactory.BuildSessionFactory();
            }
        }

        public static ISession Session(string database)
        {
            if (SessionStorage == null)
            {
                throw new Exception("NHibernateSession no está inicializado.
Llama a Init antes de operar con él. Comprueba también que haya un
ISessionStorage asociado a NHibernate.");
            }

            ISession session = SessionStorage.Session(database);
            if (session == null)
            {
                session = _sessionFactory[database].OpenSession();
                session.FlushMode = FlushMode.Commit;
                SessionStorage.SetSession(database, session);
            }

            return session;
        }
    }





El 30 de agosto de 2010 17:27, José F. Romaniello
<[email protected]>escribió:

> Hola María Teresa, me gustaría saber que hay dentro de esta línea:
>
>> var session = NHibernateSession.Session(NHibernateSession.BBDD_OFITOUR);
>
>
> Bajo ningún punto de vista deberías usar la misma session, desde diferentes
> threads, y creo que viene por ahí tu problema.
>
> El 30 de agosto de 2010 12:18, Maria Teresa Ruiz Espinosa <
> [email protected]> escribió:
>
>> Este error también nos da
>>
>> System.Data.SqlClient.SqlException: No se permite una nueva transacción
>> porque hay otros subprocesos en ejecución en la sesión.
>>
>> NHibernate.TransactionException: Begin failed with SQL exception ---> 
>> System.Data.SqlClient.SqlException: No se permite una nueva transacción 
>> porque hay otros subprocesos en ejecución en la sesión.
>>    en System.Data.SqlClient.SqlConnection.OnError(SqlException exception, 
>> Boolean breakConnection)
>>    en System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 
>> exception, Boolean breakConnection)
>>    en System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
>>    en System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, 
>> SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet 
>> bulkCopyHandler, TdsParserStateObject stateObj)
>>    en 
>> System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] 
>> buffer, TransactionManagerRequestType request, String transactionName, 
>> TransactionManagerIsolationLevel isoLevel, Int32 timeout, 
>> SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean 
>> isDelegateControlRequest)
>>    en 
>> System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest
>>  transactionRequest, String transactionName, IsolationLevel iso, 
>> SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
>>    en 
>> System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest
>>  transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction 
>> internalTransaction, Boolean isDelegateControlRequest)
>>    en 
>> System.Data.SqlClient.SqlInternalConnection.BeginSqlTransaction(IsolationLevel
>>  iso, String transactionName)
>>    en 
>> System.Data.SqlClient.SqlInternalConnection.BeginTransaction(IsolationLevel 
>> iso)
>>    en System.Data.SqlClient.SqlConnection.BeginDbTransaction(IsolationLevel 
>> isolationLevel)
>>    en 
>> System.Data.Common.DbConnection.System.Data.IDbConnection.BeginTransaction(IsolationLevel
>>  isolationLevel)
>>    en NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel 
>> isolationLevel)
>>    --- Fin del seguimiento de la pila de la excepción interna ---
>>    en NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel 
>> isolationLevel)
>>    en NHibernate.Transaction.AdoTransaction.Begin()
>>    en NHibernate.Impl.SessionImpl.BeginTransaction()
>>    en 
>> Ofi.OfiTourWeb.Repository.Consultas.ConsultaExpedientesUsuario.DameExpediente(String
>>  idExpediente) en 
>> C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Repository\Consultas\ConsultaExpedientesUsuario.cs:línea
>>  228
>>    en Ofi.OfiTourWeb.Repository.RepositorioReservas.DameExpediente(String 
>> idExpediente) en 
>> C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Repository\RepositorioReservas.cs:línea
>>  54
>>    en Ofi.OfiTourWeb.Core.Services.ServicioReservas.DameExpediente(String 
>> idExpediente) en 
>> C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Core\Services\ServicioReservas.cs:línea
>>  99
>>    en 
>> Ofi.OfiTourWeb.Web.Controllers.ReservasController.MuestraResumenReservaMail(String
>>  id) en 
>> C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Web\Controllers\ReservasController.cs:línea
>>  272
>>    en lambda_method(Closure , ControllerBase , Object[] )
>>    en System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase 
>> controller, Object[] parameters)
>>    en System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext 
>> controllerContext, IDictionary`2 parameters)
>>    en 
>> System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext 
>> controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 
>> parameters)
>>    en 
>> System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a()
>>    en 
>> System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter
>>  filter, ActionExecutingContext preContext, Func`1 continuation)
>>    en 
>> System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<>c__DisplayClassf.<InvokeActionMethodWithFilters>b__c()
>>    en 
>> System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext
>>  controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, 
>> IDictionary`2 parameters)
>>    en System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext 
>> controllerContext, String actionName)
>>    en System.Web.Mvc.Controller.ExecuteCore()
>>    en System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)
>>    en 
>> System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext
>>  requestContext)
>>    en 
>> System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__4()
>>    en 
>> System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0()
>>    en 
>> System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult
>>  _)
>>    en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
>>    en System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
>>    en 
>> System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult
>>  result)
>>    en 
>> System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
>>    en System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& 
>> completedSynchronously)
>>
>>
>> El 30 de agosto de 2010 16:50, NM <[email protected]> escribió:
>>
>> Buenas ya escribi anteriormente con problemas con nhibernate
>>>
>>> Esta función de vez en cuando me da el errro que se especifica debajo
>>>
>>> var session =
>>> NHibernateSession.Session(NHibernateSession.BBDD_OFITOUR);
>>>            using (var transaction = session.BeginTransaction())
>>>            {
>>>                usuario = session
>>>                    .CreateQuery(@"
>>>                        from NhUsuarioWeb U
>>>                        inner join fetch U.NivelAcceso
>>>                        inner join fetch U.Oficina O
>>>                        inner join fetch O.TipoClienteEstadistica
>>>                        inner join fetch U.Agente
>>>                        where U.UsuarioWeb = :login AND
>>> U.AccesoPermitido = 'S'")
>>>                    .SetParameter("login", login)
>>>                    .SetResultTransformer(new
>>> RepositorioDtoUsuarioLoginTransformer())
>>>                    .UniqueResult<Usuario>();
>>>
>>>                transaction.Commit();
>>>            }
>>>
>>>
>>> System.InvalidOperationException:
>>> Ya hay un DataReader abierto asociado a este Command, debe cerrarlo
>>> primero.
>>>
>>> NHibernate.TransactionException: Begin failed with SQL exception --->
>>> System.InvalidOperationException: Ya hay un DataReader abierto
>>> asociado a este Command, debe cerrarlo primero.
>>>   en
>>>
>>> System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand
>>> command)
>>>   en
>>>
>>> System.Data.SqlClient.SqlInternalConnection.BeginSqlTransaction(IsolationLevel
>>> iso, String transactionName)
>>>   en
>>>
>>> System.Data.SqlClient.SqlInternalConnection.BeginTransaction(IsolationLevel
>>> iso)
>>>   en
>>> System.Data.SqlClient.SqlConnection.BeginDbTransaction(IsolationLevel
>>> isolationLevel)
>>>   en
>>>
>>> System.Data.Common.DbConnection.System.Data.IDbConnection.BeginTransaction(IsolationLevel
>>> isolationLevel)
>>>   en NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel
>>> isolationLevel)
>>>   --- Fin del seguimiento de la pila de la excepción interna ---
>>>   en NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel
>>> isolationLevel)
>>>   en NHibernate.Transaction.AdoTransaction.Begin()
>>>   en NHibernate.Impl.SessionImpl.BeginTransaction()
>>>   en
>>>
>>> Ofi.OfiTourWeb.Repository.RepositorioUsuarioNh.DameDtoUsuarioLoginPorLogin(String
>>> login) en C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Repository
>>> \RepositorioUsuarioNh.cs:línea 52
>>>   en
>>>
>>> Ofi.OfiTourWeb.Repository.RepositorioUsuario.DameDtoUsuarioLoginPorLogin(String
>>> login) en C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Repository
>>> \RepositorioUsuario.cs:línea 36
>>>   en
>>>
>>> Ofi.OfiTourWeb.Core.Services.ServicioLoginUsuario.DameUsuarioPorLogin(String
>>> loginUsuario) en C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Core\Services
>>> \ServicioLoginUsuario.cs:línea 115
>>>   en
>>>
>>> Ofi.OfiTourWeb.Web.Controllers.BuscarController.RellenaFiltroBusquedaConDatosUsuario(FiltroBusqueda
>>> filtroBusqueda) en C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Web
>>> \Controllers\BuscarController.cs:línea 103
>>>   en
>>>
>>> Ofi.OfiTourWeb.Web.Controllers.BuscarController.ProcesarBusqueda(FiltroBusqueda
>>> filtroBusqueda) en C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Web
>>> \Controllers\BuscarController.cs:línea 119
>>>   en
>>>
>>> Ofi.OfiTourWeb.Web.Controllers.BuscarController.Estancias(FiltroBusquedaEstancias
>>> filtroBusquedaEstancias) en C:\Source\Ofi.OfiTourWeb\Ofi.OfiTourWeb.Web
>>> \Controllers\BuscarController.cs:línea 30
>>>   en lambda_method(Closure , ControllerBase , Object[] )
>>>   en System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase
>>> controller, Object[] parameters)
>>>   en
>>> System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext
>>> controllerContext, IDictionary`2 parameters)
>>>   en
>>>
>>> System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext
>>> controllerContext, ActionDescriptor actionDescriptor, IDictionary`2
>>> parameters)
>>>   en
>>>
>>> System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a()
>>>   en
>>>
>>> System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter
>>> filter, ActionExecutingContext preContext, Func`1 continuation)
>>>   en
>>>
>>> System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<>c__DisplayClassf.<InvokeActionMethodWithFilters>b__c()
>>>   en
>>>
>>> System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext
>>> controllerContext, IList`1 filters, ActionDescriptor actionDescriptor,
>>> IDictionary`2 parameters)
>>>   en
>>> System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext
>>> controllerContext, String actionName)
>>>   en System.Web.Mvc.Controller.ExecuteCore()
>>>   en System.Web.Mvc.ControllerBase.Execute(RequestContext
>>> requestContext)
>>>   en
>>>
>>> System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext
>>> requestContext)
>>>   en
>>> System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__4()
>>>   en
>>>
>>> System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0()
>>>   en
>>>
>>> System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult
>>> _)
>>>   en
>>> System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
>>>   en System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult
>>> asyncResult)
>>>   en
>>>
>>> System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult
>>> result)
>>>   en
>>>
>>> System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
>>>   en System.Web.HttpApplication.ExecuteStep(IExecutionStep step,
>>> Boolean& completedSynchronously)
>>>
>>>
>>> Por favor necesito solucionar este problema ya, pero no encuentro la
>>> forma.
>>>
>>> --
>>> Para escribir al Grupo, hágalo a esta dirección:
>>> [email protected]
>>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>>
>>
>>  --
>> Para escribir al Grupo, hágalo a esta dirección:
>> [email protected]
>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>
>
>  --
> Para escribir al Grupo, hágalo a esta dirección:
> [email protected]
> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>

-- 
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano

Responder a