• 0

Is this the villain? My NHibernate session management in ASP.NET MVC2


Question

Hello,

 

I'm suspecting that the way i'm handling the session on my ASP.NET MVC2 application is causing me troubles (user alleged data loss). Is this truly a bad setup? And can you guys please tell me if such problem can arise from it?

  • Nhibernate version 3.3.1.4
  • ASP.NET MVC2 / .net 3.5
  • IIS7
  • Visual studio 2010
public class NHibernateHelper
{


private static ISessionFactory _sessionFactory;

private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
var configuration = new Configuration();
configuration.Configure();
configuration.AddAssembly(typeof(EstoqueEquipamento).Assembly);
_sessionFactory = configuration.BuildSessionFactory();
}
return _sessionFactory;
}
}

public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}

public static ISessionFactory GetSessionFactory()
{
return SessionFactory;
}


}




//Helper class used by the repositories and on App_BeginRequest
public class SessionManager
{



public static ISession GetCurrentSession()
{
if (!CurrentSessionContext.HasBind(NHibernateHelper.GetSessionFactory()))
CurrentSessionContext.Bind(NHibernateHelper.GetSessionFactory().OpenSession());

return NHibernateHelper.GetSessionFactory().GetCurrentSession();
}

public static void DisposeCurrentSession()
{
ISession currentSession = CurrentSessionContext.Unbind(NHibernateHelper.GetSessionFactory());
if (currentSession != null)
{
currentSession.Close();
currentSession.Dispose();
}
}




public static void Commit()
{

GetCurrentSession().Transaction.Commit();


}

public static void EndSession()
{
DisposeCurrentSession();
}




}

//Generic repository class to handle simple CRUD operations
public class GenericRepository<T> where T : class
{



public void SaveOrUpdate(T obj)
{
SessionForTransaction.SaveOrUpdate(obj);
}




public void Delete(T obj)
{



SessionForTransaction.Delete(obj);

}




}

//Global.asax
public class MvcApplication : System.Web.HttpApplication
{

protected void Application_BeginRequest(object sender, EventArgs args)
{

}



protected void Application_EndRequest(object sender, EventArgs args)
{

SessionManager.DisposeCurrentSession();

}

}




<!-- hibernate.cfg.xml --!>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
<property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>



<property name="cache.use_second_level_cache">true</property>

<property name="connection.connection_string_name">ConexaoPRD</property>
<property name="current_session_context_class">web</property>
<property name="use_sql_comments">false</property>

</session-factory>
</hibernate-configuration>


//Sample mapping (simplified for readability's sake)
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="CMD.Business.BusinessEntity" namespace="CMD.Business.BusinessEntity.Entities">
<class name="OrdemServico" table="CEM.ORDEM_SERVICO" lazy="true" dynamic-update="true" dynamic-insert="true" where="ITEQ_SQ_ITEM_EQUIPAMENTO IS NULL">

<id name="Codigo" column="ORDS_SQ_ORDEM_SERVICO" type="Int32" unsaved-value="0">
<generator class="sequence">
<param name="sequence">CEM.SQ_ORDS_SQ_ORDEM_SERVICO</param>
</generator>
</id>

<bag name="RealizacaoPlanoManutencaoList" inverse="true" generic="true" lazy="true" cascade="all">
<key>
<column name="ORDS_SQ_ORDEM_SERVICO"/>
</key>
<one-to-many class="RealizacaoPlanoManutencao" />
</bag>

<many-to-one name="ItemEquipamentoCem" class="ItemEquipamentoCem">
<column name="ITEQ_SQ_ITEM_EQUIPAMENTO" />
</many-to-one>

<property name="NumeroOcorrencia" type="Int32" column="OCOR_NR_OCORRENCIA" />
<property name="CodigoColuna" type="String" column="COLU_CD_COLUNA" />


</class>
</hibernate-mapping>

Thanks!

Link to comment
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

This topic is now closed to further replies.