estou tentando fazer uma aplicação que vai rodar em ASP.net MVC usando Nhibernat + Fluent e estou com o seguinte problema:
public class HibernateHelper
{
private static readonly object factorylock = new object();
private static HibernateHelper hibernateHelper;
//private Configuration configuration;
private ISessionFactory _sessionFactory;
private HibernateHelper()
{
try
{
lock (factorylock)
{
MsSqlConfiguration config2 = MsSqlConfiguration.MsSql2008;
config2.ConnectionString("data source=.;initial catalog=DBTeste;integrated security=True;"); //Server=.; Database=/banco/BdLocalTeste.mdf; Integrated Security=SSPI;
config2.ShowSql();
config2.FormatSql();
_sessionFactory = Fluently.Configure()
.Database(config2)
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Categoria>())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Cliente>())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Pedido>())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Produto>())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Usuario>())
.BuildSessionFactory();
}
}
catch (Exception)
{
throw;
}
}
public static HibernateHelper getInstance()
{
try
{
if (hibernateHelper == null)
{
hibernateHelper = new HibernateHelper();
}
}
catch (Exception)
{
throw;
}
return hibernateHelper;
}
public ISessionFactory SessionFactory
{
get { return _sessionFactory; }
}
public ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
public abstract class HibernateDao<TEntity, TId> : IDAO<TEntity, TId>
where TEntity : EntidadeBasica<TId>
where TId : IEquatable<TId>
{
private HibernateHelper _hibernateHelper;
public HibernateDao()
{
try{
_hibernateHelper = HibernateHelper.getInstance();
}
catch (Exception)
{
throw;
}
}
#region atribtos hibernate
protected HibernateHelper HibernateHelper
{
get { return _hibernateHelper; }
}
#endregion
#region metodos genericos
//[Transaction(ReadOnly = false)]
public void incluir(TEntity entidade)
{
ISession session = null;
ITransaction transaction = null;
try
{
session = HibernateHelper.OpenSession();
transaction = session.BeginTransaction();
entidade.DataCriacao = DateTime.Now;
session.Save(entidade);
transaction.Commit();
}
catch (Exception e)
{
if (transaction.IsActive && !transaction.WasCommitted)
{
transaction.Rollback();
}
throw;
}
finally
{
//if (session.IsConnected && session.IsOpen)
//{
// session.Close();
//}
}
}
//[Transaction(ReadOnly = false)]
public void salvar(TEntity entidade)
{
ISession session = null;
ITransaction transaction = null;
try
{
session = HibernateHelper.OpenSession();
transaction = session.BeginTransaction();
entidade.DataAlteracao = DateTime.Now;
//session.SaveOrUpdate(entidade);
session.Update(entidade);
transaction.Commit();
}
catch (Exception e)
{
if (transaction.IsActive && !transaction.WasCommitted)
{
transaction.Rollback();
}
throw;
}
finally
{
//if (session.IsConnected && session.IsOpen)
//{
// session.Close();
//}
}
}
//[Transaction(ReadOnly = false)]
public void delete(TEntity entidade)
{
//CurrentSession.Delete(entidade);
}
//[Transaction(ReadOnly = true)]
public TEntity consultarPorId(TId Id)
{
ISession session = null;
TEntity resultado = null;
try
{
session = HibernateHelper.OpenSession();
resultado = session.Get<TEntity>(Id);
}
catch (Exception e)
{
throw new Exception(String.Format("Erro consultando o objeto do tipo {0}", typeof(TEntity)), e);
}
finally
{
//if (session.IsConnected && session.IsOpen)
//{
// session.Close();
//}
}
return resultado;
}
//[Transaction(ReadOnly = true)]
public IList<TEntity> listarTodos()
{
//ICriteria criteria = HibernateHelper.CurrentSession.CreateCriteria<TEntity>();
//return criteria.List<TEntity>();
ISession session = null;
IList<TEntity> resultado = null;
try
{
session = HibernateHelper.OpenSession();
ICriteria criteria = session.CreateCriteria<TEntity>();
resultado = criteria.List<TEntity>();
}
catch (Exception e)
{
throw new Exception(String.Format("Erro listando o objeto do tipo {0}", typeof(TEntity)), e);
}
finally
{
//if (session.IsConnected && session.IsOpen)
//{
// session.Close();
//}
}
return resultado;
}
public IList<TEntity> listarCriteria(TEntity obj)
{
ISession session = null;
IList<TEntity> resultado = null;
try
{
obj.DataAlteracao = null;
obj.DataCriacao = null;
session = HibernateHelper.OpenSession();
ICriteria criteria = session.CreateCriteria<TEntity>();
resultado = criteria.Add(Example.Create(obj)).List<TEntity>();
}
catch (Exception e)
{
throw new Exception(String.Format("Erro listando o objeto do tipo {0}", typeof(TEntity)), e);
}
finally
{
//if (session.IsConnected && session.IsOpen)
//{
// session.Close();
//}
}
return resultado;
}
#endregion
}
Notem que as sessoes nunca sao fechadas pois dará erro de lezyload na hora de buscar os produtos do pedido por exemplo.
Acredito que por elas nunca serem fechadas, esse erro esta acontecendo porem nao sei como resolver!