Как я могу получить последние данные из базы данных с помощью NHibernate после обновления? - PullRequest
4 голосов
/ 26 сентября 2008

Вот сценарий:

У меня есть приложение winforms, использующее NHibernate. При запуске я заполняю DataGridView результатами запроса NHibernate. Эта часть отлично работает. Если я обновлю запись в этом списке и сброслю сеанс, обновление получит базу данных. После закрытия формы после обновления я вызываю метод для получения списка объектов, чтобы снова заполнить DataGridView, чтобы получить изменения, а также получить любые другие изменения, которые могли произойти кем-то другим. Проблема в том, что запись, которая была обновлена, NHibernate не отражает изменения в списке, который она дает мне. Когда я вставляю или удаляю запись, все работает нормально. Именно когда я обновляюсь, я получаю такое поведение. Я сузил его до NHibernate с их механизмом кэширования. Я не могу найти способ заставить NHibernate извлекать данные из базы данных вместо использования кэша после обновления. Я писал на форумах NHibernate, но предложения, которые они мне дали, не сработали. Я заявил это, и никто не ответил в ответ. Я не собираюсь заявлять, что я пытался, если я не сделал это правильно. Если вы ответите чем-то, что я попробовал точно, я укажу это в комментариях к вашему ответу.

Это код, который я использую для получения списка:

public IList<WorkOrder> FindBy(string fromDate, string toDate)
{
    IQuery query = _currentSession.CreateQuery("from WorkOrder wo where wo.Date >= ? and wo.Date <= ?");
    query.SetParameter(0, fromDate);
    query.SetParameter(1, toDate);
    return query.List<WorkOrder>();
}

Сессия передается классу при его создании. Я также могу опубликовать свой файл сопоставления, но я не уверен, что с ним что-то не так, поскольку все остальное работает. Кто-нибудь видел это раньше? Это первый проект, который я использовал NHibernate, спасибо за помощь.

Ответы [ 2 ]

3 голосов
/ 10 октября 2008

После обновления удалите объект из кэша первого уровня.

Session.Update(obj);
Session.Evict(obj);

Возможно, вы захотите зафиксировать и / или очистить первым.

0 голосов
/ 26 сентября 2008

как насчет обновления? - см. 9.2. Загрузка объекта из документов:

"sess.Save (кошка); sess.Flush (); // принудительно вставляем SQL sess.Refresh (кошка); // перечитываем состояние (после запуска триггера) «

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...