使用NHibernate Castle设施延迟加载
我是否必须关闭Castle的ISessionManager为NHibernate生成的ISession?我如何处理那些使用NHibernate Castle设施延迟加载,nhibernate,castle-windsor,lazy-loading,castle,windsor-nhfacility,Nhibernate,Castle Windsor,Lazy Loading,Castle,Windsor Nhfacility,我是否必须关闭Castle的ISessionManager为NHibernate生成的ISession?我如何处理那些I会话的事务?我对NHibernate还是个新手 编辑:我希望延迟加载,但收到以下消息: 初始化[延迟失败] 初始化角色的集合:,否 “会话或会话已关闭” 这是我的通用存储库,我继承它来实现特定实例 [Transactional] public class Repository<TKey, TModel> : IRepository<TKey, TMod
I会话
的事务?我对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) { }
}
是,请始终处理
会话
。请参阅
对于事务,请考虑使用.< /P>
因此,即使您显然已经处理了ISession
,它也会在需要时巧妙地处理ISession
,并将事务考虑在内
它使用ASP.NET MVC+Castle自动事务处理工具+NHibernate工具我们使用带有语句的事务来处理事务
public void Save<K>(K entity)
{
if (entity == null)
throw new ArgumentNullException("item", "The item being saved cannot be null.");
using (ISession session = GetSession())
{
using (ITransaction tx = session.BeginTransaction())
{
session.SaveOrUpdate(entity);
tx.Commit();
}
}
}
公共作废保存(K实体)
{
if(实体==null)
抛出新ArgumentNullException(“项”,“正在保存的项不能为null”);
使用(ISession session=GetSession())
{
使用(ITransaction tx=session.BeginTransaction())
{
会话。保存或更新(实体);
tx.Commit();
}
}
}
如果在同一操作中进行修改后访问对象,我仍然会遇到延迟加载错误。我已通过在保存后不访问对象修复了此错误。以下是解释:
我认为这是因为没有正确保存层次结构。我还没有测试它,但如果您希望访问父对象,可能保存它们会解决问题。只需在保存后将需要访问的信息放入局部变量中,然后再保存,就可以解决我的问题。您真正需要的是一些示例代码。请参阅nd测试:你能告诉我一个显示延迟加载功能的文件吗?你注册了sessionwebmodule吗?你在使用ATM吗?你的事务类是否用[transactional]和[Transaction]修饰?请发布一些代码。存储库代码看起来不错。你能发布一个调用存储库的方法吗?
public void Save<K>(K entity)
{
if (entity == null)
throw new ArgumentNullException("item", "The item being saved cannot be null.");
using (ISession session = GetSession())
{
using (ITransaction tx = session.BeginTransaction())
{
session.SaveOrUpdate(entity);
tx.Commit();
}
}
}