NHibernate: как я могу игнорировать кэш и перейти непосредственно к базе данных?
Рассмотрим типичный контекст класса NHibernate на.
public class SampleContext : NHibernateContext
{
public SampleContext(ISession session)
: base(session)
{ }
public IQueryable<Person> People
{
get { return Session.Linq<Person>(); }
}
public Person GetPerson(int id)
{
get { return Session.Linq<Person>().SingleOrDefault(p => p.ID == id); }
}
}
Мой вопрос:
- Как я могу переписать метод GetPerson, чтобы игнорировать кэш и получать данные непосредственно из базы данных?
1 ответ:
Есть несколько способов подойти к этой проблеме:
По моему опыту, я пробовал и #2, и #3 и в конечном итоге всегда приходил к рефакторингу, чтобы сделать #1.
Ребята из Hibernate скажут вам, что вы, вероятно, должны открыть другую сессию, чтобы получить последние данные из базы данных. Они хотели бы указать, что цель сессии заключается в том, чтобы охватить относительно кратковременную единицу работы.
Вы можете либо ввести вызов
Session.Refresh()
внутри вашего методаGetPerson()
, чтобы всегда получать самое текущее состояние из базы данных, либо вы можете предоставьте эту функциональность с помощью вашего собственного методаRefresh()
.Кроме того, если у вас есть дескриптор самого объекта
Person
, Вы можете также попробоватьSession.Evict()
удалить объектPerson
из кэша сеанса перед его повторной загрузкой.