title: Nhibernate null reference exception during database connection
body: <p>I am getting this exception sometimes when my program is starting connection to MS SQL 2005 EXPRESS DB on Windows XP. Sometimes I got this error and sometimes not... NHibernate v3</p>
  
  <p>DBMonitor class runs on separate thread, but only on one, i the future can run on multiple.</p>
  
  <p>I have similar SessionProviderMsSql2005 class but only for SQLite connection and it has same issue and session provider for sqlite runs on multiple threads... </p>
  
  <pre><code>System.NullReferenceException: Object reference not set to an instance of an object.
     at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
     at System.Collections.Generic.Dictionary`2.set_Item(TKey key, TValue value)
     at NHibernate.Impl.SessionFactoryObjectFactory.AddInstance(String uid, String name,         ISessionFactory instance, IDictionary`2 properties)
     at NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg, IMapping mapping, Settings settings, EventListeners listeners)
     at NHibernate.Cfg.Configuration.BuildSessionFactory()
     at MySolution.DatabaseLayer.Repositories.SessionProviderMsSql2005.get_SessionFactory()
     at MySolution.DatabaseLayer.Repositories.SessionProviderMsSql2005.OpenSession()
  </code></pre>
  
  <p>There is my SessionProviderMsSql2005 class</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using NHibernate;
  using NHibernate.Cfg;
  using Environment = NHibernate.Cfg.Environment;
  
  namespace MySolution.DatabaseLayer.Repositories
  {
      public class SessionProviderMsSql2005
      {
          private static readonly object _padlock = new object();
  
          private static Configuration _configuration;
          public static Configuration Configuration
          {
              get
              {
                  lock (_padlock)//must be thread save!
                  {
                      if (_configuration == null)
                      {
  
                          if (string.IsNullOrEmpty(InitialCatalog))
                          {
                              throw new NullReferenceException("Property InitialCatalog could not be null or empty!");
                          }
  
                          if (string.IsNullOrEmpty(ServerName))
                          {
                              throw new NullReferenceException("Property ServerName could not be null or empty!");
                          }
  
                          _configuration = new Configuration();
                          _configuration.Configure("Config/Hibernate.MsSql2005.cfg.xml");
                          _configuration.AddAssembly("MySolution.DatabaseLayer");
                          Configuration.AddProperties(new Dictionary&lt;string, string&gt; 
                                                       {
                                                           { Environment.ConnectionString, @"Server="+ServerName+";initial catalog="+InitialCatalog+";Integrated Security=SSPI;" }
                                                       });
                      }
                      return _configuration;
                  }
              }
          }
  
          private static ISessionFactory _sessionFactory;
          public static ISessionFactory SessionFactory
          {
              get
          {
              lock (_padlock)
              {
                  if (_sessionFactory == null)
                  {
                      lock (_padlock)
                      {
                          _sessionFactory = Configuration.BuildSessionFactory();
                      }
                  }
                  return _sessionFactory;
              }
          }
          }
  
          public static string ServerName { get; set; }
          public static string InitialCatalog { get; set; }
  
  
          private SessionProviderMsSql2005()
          { }
  
          public static ISession OpenSession()
          {
              lock (_padlock)
              {
                  return SessionFactory.OpenSession();
              }
          }
  
          public static void CloseSession()
          {
              lock (_padlock)
              {
                  SessionFactory.Close();
              }
          }
      }
  }
  </code></pre>
  
  <p>I am using this class like this:</p>
  
  <pre><code> public class DBMonitor
  {
      private ISession _session;
  
  
      public DBMonitor(string serverName, string initialCatalog)
      {
          SessionProviderMsSql2005.ServerName = serverName;
          SessionProviderMsSql2005.InitialCatalog = initialCatalog;
      }
  
      public void Start()
      {
  
       _session = SessionProviderMsSql2005.OpenSession();
  
       IList data = _session.CreateSQLQuery("SELECT * FROM someTable WHERE id = 1").List();
  
        ...
       }
     }
  </code></pre>
  
  <p>Any idea what cause this?</p>
  
  <p>Update: correction of SessionFactory getter. Is it correct?</p>