Note that there are some explanatory texts on larger screens.

plurals
  1. POAbout NHibernate session manager
    text
    copied!<p>Hello I'm new to nhibernate and I'm trying to make a session manager for an web application that will allow me to use it when new client calls it. I found a session manager that will be good for me I think but I dont have a point how to run it in my web API because they just give the code and no implementation. Can anyone help me?</p> <pre><code>using System.Web; using NHibernate; using NHibernate.Cache; using NHibernate.Cfg; using System.Runtime.Remoting.Messaging; namespace BLLEwidencjaTest { public class NHibernateSessionManager { private static Configuration _configuration; public static NHibernateSessionManager Instance { get { return Nested.NHibernateSessionManager; } } private NHibernateSessionManager() { InitSessionFactory(); } private class Nested { static Nested() { } internal static readonly NHibernateSessionManager NHibernateSessionManager = new NHibernateSessionManager(); } private void InitSessionFactory() { _configuration = new Configuration(); _configuration.Configure(); _configuration.AddAssembly(typeof(NHibernateSessionManager).Assembly); sessionFactory = _configuration.BuildSessionFactory(); } /// &lt;summary&gt; /// Allows you to register an interceptor on a new session. This may not be called if there is already /// an open session attached to the HttpContext. If you have an interceptor to be used, modify /// the HttpModule to call this before calling BeginTransaction(). /// &lt;/summary&gt; public void RegisterInterceptor(IInterceptor interceptor) { ISession session = ContextSession; if (session != null &amp;&amp; session.IsOpen) { throw new CacheException("You cannot register an interceptor once a session has already been opened"); } GetSession(interceptor); } public ISession GetSession() { return GetSession(null); } /// &lt;summary&gt; /// Gets a session with or without an interceptor. This method is not called directly; instead, /// it gets invoked from other public methods. /// &lt;/summary&gt; private ISession GetSession(IInterceptor interceptor) { ISession session = ContextSession; if (session == null) { if (interceptor != null) { session = sessionFactory.OpenSession(interceptor); } else { session = sessionFactory.OpenSession(); } ContextSession = session; } //Check.Ensure(session != null, "session was null"); return session; } /// &lt;summary&gt; /// Flushes anything left in the session and closes the connection. /// &lt;/summary&gt; public void CloseSession() { ISession session = ContextSession; if (session != null &amp;&amp; session.IsOpen) { session.Flush(); session.Close(); } ContextSession = null; } public void BeginTransaction() { ITransaction transaction = ContextTransaction; if (transaction == null) { transaction = GetSession().BeginTransaction(); ContextTransaction = transaction; } } public void CommitTransaction() { ITransaction transaction = ContextTransaction; try { if (HasOpenTransaction()) { transaction.Commit(); ContextTransaction = null; } } catch (HibernateException) { RollbackTransaction(); throw; } } public bool HasOpenTransaction() { ITransaction transaction = ContextTransaction; return transaction != null &amp;&amp; !transaction.WasCommitted &amp;&amp; !transaction.WasRolledBack; } public void RollbackTransaction() { ITransaction transaction = ContextTransaction; try { if (HasOpenTransaction()) { transaction.Rollback(); } ContextTransaction = null; } finally { CloseSession(); } } /// &lt;summary&gt; /// If within a web context, this uses &lt;see cref="HttpContext" /&gt; instead of the WinForms /// specific &lt;see cref="CallContext" /&gt;. Discussion concerning this found at /// http://forum.springframework.net/showthread.php?t=572. /// &lt;/summary&gt; private ITransaction ContextTransaction { get { if (IsInWebContext()) { return (ITransaction)HttpContext.Current.Items[TRANSACTION_KEY]; } else { return (ITransaction)CallContext.GetData(TRANSACTION_KEY); } } set { if (IsInWebContext()) { HttpContext.Current.Items[TRANSACTION_KEY] = value; } else { CallContext.SetData(TRANSACTION_KEY, value); } } } /// &lt;summary&gt; /// If within a web context, this uses &lt;see cref="HttpContext" /&gt; instead of the WinForms /// specific &lt;see cref="CallContext" /&gt;. Discussion concerning this found at /// http://forum.springframework.net/showthread.php?t=572. /// &lt;/summary&gt; private ISession ContextSession { get { if (IsInWebContext()) { return (ISession)HttpContext.Current.Items[SESSION_KEY]; } else { return (ISession)CallContext.GetData(SESSION_KEY); } } set { if (IsInWebContext()) { HttpContext.Current.Items[SESSION_KEY] = value; } else { CallContext.SetData(SESSION_KEY, value); } } } private bool IsInWebContext() { return HttpContext.Current != null; } private const string TRANSACTION_KEY = "CONTEXT_TRANSACTION"; private const string SESSION_KEY = "CONTEXT_SESSION"; private ISessionFactory sessionFactory; } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload