Do I need to close the ISession that the Castle ISessionManager for NHibernate created? How to process transactions using these ISession ? I'm still pretty new to NHibernate.
Edit: I would like to have a lazy load, but I get this message:
Initialization [failed to lazily initialize role collection :, no session or session closed "
Here is my shared repository, which I inherit for implementing specific instances.
[Transactional] public class Repository<TKey, TModel> : IRepository<TKey, TModel> where TKey : IComparable where TModel : class { private readonly ISessionManager _sessionManager; protected ISession Session { get { return _sessionManager.OpenSession(); } } public Repository(ISessionManager sessionManager) { _sessionManager = sessionManager; } #region IRepository<TKey,TModel> Members public virtual TModel Select(TKey key) { using (var session = _sessionManager.OpenSession()) { return session.Get<TModel>(key); } } public virtual IList<TModel> SelectWhere(Func<TModel, bool> query) { using (var session = Session) { return session.Linq<TModel>().Where(query).ToList(); } } public virtual TModel Single(Func<TModel, bool> query) { using (var session = Session) { return session.Linq<TModel>().SingleOrDefault(query); } } public virtual TModel First(Func<TModel, bool> query) { using (var session = Session) { return session.Linq<TModel>().FirstOrDefault(query); } } public virtual IList<TModel> All() { using (var session = Session) { return session.Linq<TModel>().ToList(); } } [Transaction(TransactionMode.Requires)] public virtual void Store(TModel entity) { using (var session = Session) { session.SaveOrUpdate(entity); } } [Transaction(TransactionMode.Requires)] public virtual void Store(IEnumerable<TModel> entities) { using (var session = Session) { foreach (TModel entity in entities) session.SaveOrUpdate(entity); } } [Transaction(TransactionMode.Requires)] public virtual void Remove(TModel entity) { using (var session = Session) { session.Delete(entity); } } public virtual void Remove(Func<TModel, bool> query) { IEnumerable<TModel> entities = SelectWhere(query); Remove(entities); } [Transaction(TransactionMode.Requires)] public virtual void Remove(IEnumerable<TModel> entities) { using (var session = Session) { foreach (TModel entity in entities) session.Delete(entity); } } #endregion } public class Repository<TModel> : Repository<Guid, TModel>, IRepository<TModel> where TModel : class { public Repository(ISessionManager sessionManager) : base(sessionManager) { } } public class Repository : Repository<ulong, object>, IRepository { public Repository(ISessionManager sessionManager) : base(sessionManager) { } }
Here is an example calling this repository:
IUserRepository userRepository = new UserRepository(); // This is actually provided by my IoC var users = userRepository.All(); foreach (var user in Users) { foreach (var picture in user.Pictures) { // I get exceptions when I do stuff like this. } }
nhibernate castle-windsor lazy-loading castle windsor-nhfacility
Daniel A. White
source share