Występują problemy z moją ISessions w NHibernate. Wciąż otrzymuję "Sesja zamknięta!" błędy. Czy ktoś może mi pokazać poprawny wzór zawierający definicję następujących metod i kiedy używać każdego:Jak prawidłowo używać obiektu NHibernate ISession - Sesja jest zamknięta! błędy
ISession.Close()
ISession.Dispose()
ISession.Disconnect()
Oto mój problem. Mam konfigurację oddzwaniania, aby odpalić proces, który co kilka minut przyznaje graczom odznaki. Jednak wciąż otrzymuję "Sesja zamknięta!" błędy lub błędy związane z brakiem możliwości powiązania kolekcji.
Oto mój Repozytorium:
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
}
Oto mój zwyczaj. Repozytorium jest wstrzykiwane za pomocą mapy struktury
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();
}
}
}
}
}
czy to jest aplikacja internetowa? – mxmissile
Tak, nie jest to aplikacja internetowa, ale nie integruję sesji NHibernate z sesją internetową. – Micah
Czy to _repository używane są gdziekolwiek indziej?Ponieważ inne wywołanie OpenSession() straciłoby pierwsze. – dotjoe