我遇到了NHibernate中我的ISessions問題。我不斷收到「Session Closed!」錯誤。有人可以告訴我正確的模式,包括以下方法的定義以及何時使用:如何正確使用NHibernate ISession對象 - 會話關閉!錯誤
ISession.Close()
ISession.Dispose()
ISession.Disconnect()
這是我的問題。我有一個回調設置來觸發一個過程,每隔幾分鐘向玩家頒發一次徽章。但是我不斷收到「會話關閉!」無法關聯集合的錯誤或錯誤。
這裏是我的倉庫:
public class NHibernateRepository : IRepository
{
#region Fields
private ISession _session;
private readonly ISessionFactory _sessionFactory;
#endregion
#region Constructors
public NHibernateRepository(ISessionFactory sessionFactory)
{
_sessionFactory = sessionFactory;
}
#endregion
#region IRepository Implementation
public ISession OpenSession()
{
_session = _sessionFactory.OpenSession();
return _session;
}
public IQueryable<TModel> All<TModel>()
{
return _session.Linq<TModel>();
}
public void Save<TModel>(TModel model)
{
_session.Save(model);
}
public void Update<TModel>(TModel model)
{
_session.Update(model);
}
public void Delete<TModel>(TModel model)
{
_session.Delete(model);
}
public ITransaction BeginTransaction()
{
return _session.BeginTransaction();
}
public void Flush()
{
_session.Flush();
}
#endregion
}
這是我的使用情況。該存儲庫正在通過結構圖注入
private Object _awardBadgesLock = new object(); //In case the callback happens again before the previous one completes
public void AwardBadges()
{
lock (_awardBadgesLock)
{
using(session = _repository.OpenSession())
{
foreach (var user in _repository.All<User>().ToList())
{
var userPuzzles = _repository.All<Puzzle>().ByUser(user.Id).ToList();
var userVotes = _repository.All<Vote>().Where(x => x.UserId == user.Id).ToList();
var userSolutions = _repository.All<Solution>().ByUser(user.Id).ToList().Where(x => !userPuzzles.Select(y => y.Id).Contains(x.PuzzleId));
var ledPuzzles = GetPuzzlesLedByUser(user.Id);
AwardPlayerBadge(user, userSolutions);
AwardCriticBadge(user, userVotes);
AwardCreatorBadge(user, userPuzzles);
AwardRidlerBadge(user, userPuzzles);
AwardSupporterBadge(user, userVotes);
AwardPopularBadge(user, userPuzzles);
AwardNotableBadge(user, userPuzzles);
AwardFamousBadge(user, userPuzzles);
AwardLeaderBadge(user, ledPuzzles);
using (var tx = _repository.BeginTransaction())
{
_repository.Update(user);
tx.Commit();
}
}
}
}
}
這是一個網絡應用程序? – mxmissile 2009-09-24 17:37:06
是的,我沒有一個網絡應用程序,但我沒有將NHibernate會話與Web會話進行整合。 – Micah 2009-09-24 18:09:33
_repository是否在其他地方使用?因爲,另一個OpenSession()調用將失去第一個。 – dotjoe 2009-09-24 18:58:00