I am using NHibernate to connect to my database and retreive some data as follows:
public abstract class BaseContext<TContext> : IBaseContext<TContext> where TContext : IGuid
{
#region Data Members
// NHibernate session
private readonly Lazy<ISession> _session;
// Logger
private static readonly ILog log = LogManager.GetLogger(typeof(BaseContext<TContext>));
#endregion
#region Ctor
protected BaseContext()
{
// Initialize session
_session = new Lazy<ISession>(NHibernateHelper.OpenSession);
// log
log.Debug("Session has been created but has not yet been used.");
}
#endregion
#region Propreties
/// <summary>
/// Lazy load a session with NHibernate
/// </summary>
public ISession Session
{
get { return _session.Value; }
}
#endregion
#region Methods
/// <summary>
/// Retreives all object of type <see cref="TContext"/> from the database.
/// </summary>
/// <returns>A list of all the <see cref="TContext"/> items</returns>
public IEnumerable<TContext> Get()
{
try
{
log.DebugFormat("Retrieving all items of type {0} from the database.",
typeof(TContext).Name);
// Return all the items of TContext type
return from item in Session.Query<TContext>()
select item;
}
catch (Exception ex)
{
log.Error("Could not retreive items from the database.", ex);
return default(IEnumerable<TContext>);
}
}
/// <summary>
/// Disposes the context
/// </summary>
public void Dispose()
{
// Dispose session
Session.Dispose();
}
#endregion
}
I have a wrapper class that represent each entity I want to retreive, such as :
public class EntityContext : BaseContext<DataEntity>
{
#region Methods
/// <summary>
/// Gets a list of all enitities
/// </summary>
/// <returns>A list of all entities</returns>
public new IEnumerable<DataEntity> Get()
{
return base.Get();
}
#endregion
}
To expose this, I created a WCF Service that uses it:
public List<DataEntity> Get()
{
using (EntityContext context = new EntityContext())
{
var entities = context.Get();
return entities.ToList();
}
}
When I was consuming the WCF Service, I kept getting 'Connection aborted' exception, until i figured out the cause. when I remove the using statement (the call for the Dispose method) it works fine.
My question is why? and how should I implement this correctly?
Thanks, Omri