• 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!

0 answers to this question

Recommended Posts

There have been no answers to this question yet

This topic is now closed to further replies.
  • Posts

    • No download links, please.
    • CMF's new Watch 3 Pro is already 20% off by Taras Buria CMF, a budget-focused subbrand of Nothing, recently announced its third-generation smart watch, the CMF Watch 3 Pro. Right after launch, the smart watch received a nice 20% discount, allowing you to get this already inexpensive watch at an even lower price on Amazon. The CMF Watch 3 Pro offers quite a lot of features for an $80 gadget. In addition to displaying time and notifications on a circular 60Hz AMOLED display with always-on mode support, it packs a more accurate heart rate sensor with blood oxygen tracking and stress measurement. It also has dual-band GPS for precise workout tracking, over 130 built-in exercises, Bluetooth calling support, and even ChatGPT integration. The latter lets you ask ChatGPT from your wrist without reaching for your phone. The watch is IP68 rated, which means it can withstand sweat and water splashes. As for the battery life, CMF promises 13 days on a single charge. The CMF Watch 3 Pro is available in two colors: Ash Gray and Dark Gray. Both variants have color-matching silicone bands, which you can replace with any other band that matches the size. The CMF Watch 3 Pro is compatible with modern iPhones and Android devices, and you can pair it to your phone using the Nothing X application from the Apple App Store or Google Play Store. CMF Watch 3 Pro Smart Watch - $79 | 20% off This Amazon deal is US-specific and not available in other regions unless specified. If you don't like it or want to look at more options, check out the Amazon US deals page here. Get Prime (SNAP), Prime Video, Audible Plus or Kindle / Music Unlimited. Free for 30 days. As an Amazon Associate, we earn from qualifying purchases.
    • Thank you, EU. Too bad US will never do that.
    • Debian is getting better and better with each new release, more attractive now than Ubuntu even for beginners.
    • Actually, when Windows came to "play" decades ago, they never left. Play took over the Operating System to the detriment of business of serious consumer users. Made worse, in the Microsoft removed the option to have a "non-play oriented version of the OS" (as in a separate SKU).
  • Recent Achievements

    • First Post
      Electronic Person earned a badge
      First Post
    • Week One Done
      CyberCeps666 earned a badge
      Week One Done
    • Very Popular
      d4l3d earned a badge
      Very Popular
    • Dedicated
      Stephen Leibowitz earned a badge
      Dedicated
    • Dedicated
      Snake Doc earned a badge
      Dedicated
  • Popular Contributors

    1. 1
      +primortal
      629
    2. 2
      ATLien_0
      240
    3. 3
      Xenon
      163
    4. 4
      neufuse
      124
    5. 5
      +FloatingFatMan
      124
  • Tell a friend

    Love Neowin? Tell a friend!