我需要关闭由Castle的ISessionManager生成的ISession吗?如何处理这些ISession的事务?我对NHibernate还很陌生。
编辑:我想要延迟加载,但我得到了这个错误消息:
“初始化失败[无法延迟初始化角色的集合,没有会话或会话已关闭]”
以下是我的通用存储库,我继承它来实现特定的实例。
这是调用该存储库的示例:
编辑:我想要延迟加载,但我得到了这个错误消息:
“初始化失败[无法延迟初始化角色的集合,没有会话或会话已关闭]”
以下是我的通用存储库,我继承它来实现特定的实例。
[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) { }
}
这是调用该存储库的示例:
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.
}
}