Я использую общий репозиторий вместе с NHibernate, но у меня проблема с остановкой утечек памяти/открытием сессий.NHibernate GenericRepo Memory Leak
Метод
public IQueryable<TEntity> Find()
{
ISession session = _sessionFactory.OpenSession();
return session.Query<TEntity>();
}
Очевидно, что это оставляет сессию открытой, однако, когда я использую follwing
public IQueryable<TEntity> Find()
{
using (ISession session = _sessionFactory.OpenSession())
{
return session.Query<TEntity>();
}
}
Сессия закрывается при выполнении запроса.
Есть ли в любом случае я могу избавиться от сеанса после запуска запроса?
Вызывающие этот метод выглядит следующим образом:
MyRepo repo = new MyRepo();
var list = repo.MyEntity.Find().Where(e => e.Id ==0).First();
//Need to dispose here????
Может ли это быть сделан без метода вызова нуждающегося в явной форме распоряжаться. То есть Хотелось бы избежать.
MyRepo repo = new MyRepo();
var list = repo.MyEntity.Find().Where(e => e.Id ==0).First();
repo.DisposeSession();
Заранее благодарен.
EDIT
Вот класс репо
управленияpublic NHibernateRepo<TEntity> : IRepo<TEntity> where TEntity : class
{
private readonly SessionFactory _sessionFactory;
public NHibernateRepo(SessionFactory sessionFactory)
{
_sessionFactory = sessionFactory;
}
public IQueryable<TEntity> Find()
{
ISession session = _sessionFactory.OpenSession();
return session.Query<TEntity>();
}
public void Add(TEntity entity)
{
using (ISession session = _sessionFactory.OpenSession())
{
session.Save(entity);
}
}
//Update and delete methods essentially same as add
}
Эта сессия, кажется, добиться того, что мне нужно, но я уверен, что там должно быть что-то небезопасное об этом. Есть предположения??
public class NHibernateRepo<TEntity> : IRepo<TEntity> where TEntity : class
{
private readonly ISessionFactory _sessionFactory;
private ISession _session;
public NHibernateRepo(Configuration configuration)
{
configuration.SetProperty("current_session_context_class", "thread_static");
_sessionFactory = configuration.BuildSessionFactory();
}
private ISession GetOpenSession()
{
if (_session == null)
{
if (!CurrentSessionContext.HasBind(_sessionFactory))
CurrentSessionContext.Bind(_sessionFactory.OpenSession());
_session = _sessionFactory.GetCurrentSession();
}
if (!_session.IsOpen)
{
_session = _sessionFactory.OpenSession();
}
return _session;
}
public IQueryable<TEntity> Find()
{
ISession session = GetOpenSession();
session.Clear();
return session.Query<TEntity>();
}
public void Update(TEntity value)
{
using (ISession session = GetOpenSession())
{
session.Transaction.Begin();
session.Update(value);
session.Transaction.Commit();
session.Flush();
session.Clear();
}
}
Проблема не с вашим хранилищем, а ваше управлением сеансами. Открываете ли вы закрытие сессии по запросу? (Это веб-проект) – Rippo
Это клиентский проект Windows Server \ Win формы, но в идеале я хотел бы использовать тот же стиль репозитория в любом типе проекта. Я приложу весь класс Repo к моему вопросу. Я не слишком разбираюсь в управлении сеансами Nhibernate. –