Dan*_*ite 5 nhibernate castle-windsor castle lazy-loading windsor-nhfacility
我是否必须关闭ISessionCastle ISessionManager为NHibernate 生成的?我该如何处理这些交易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) { }
}
Run Code Online (Sandbox Code Playgroud)
以下是调用该存储库的示例:
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.
}
}
Run Code Online (Sandbox Code Playgroud)
是的,总是处置掉ISession.查看有关ISessionManager使用情况的文档.
对于交易,请考虑使用自动交易工具.
该SessionManager是ATM感知所以它会处置ISession巧妙,当它需要,同时交易考虑,即使你有明显的配置ISession.
这是一个快速而肮脏的示例应用程序,它使用ASP.NET MVC + Castle自动事务处理工具+ NHibernate工具