NHibernate и сеанс на разговор в сценарии AJAX: необходима ручная очистка? - PullRequest
1 голос
/ 30 мая 2011

мы сталкиваемся с очень странной проблемой с нашим приложением, до сих пор я не вижу возможности решить эту проблему:

Приложение использует NHibernate (3.1.x) в архитектуре сеанса на разговор, что означаетв начале / конце каждого запроса ASP / IIS сеанс NHibernate с новой транзакцией открывается / закрывается + очищается / фиксируется.

Теперь у нас есть почтовый ящик в приложении, включающий простую почтовую сетку: почтовая сетка заполненапервый раз, когда пользователь входит в почтовый ящик (start-Request создает новый сеанс / транзакцию NHibernate, загружает содержимое из БД, при завершении запроса сеанс закрывается)

Проблема возникает при удалении почты:

(1) удаление почты не происходит посредством полной перезагрузки / обновления страницы, вместо этого она вызывает веб-сервис, который возвращает новую отображаемую HTML-сетку после удаления сообщения.Этот веб-сервис удаляет почту, выполняя простую

T_Mails m = T_Mails.GetMailByID( 12345678 );
m.Status = MailStatusDeleted;
NHibernateSession.Update( m );

(2) После этого вызова для обновления почты, та же функция также повторно отображает обновленную почтовую сетку - она ​​делает это, запрашивая последние 5 строкв таблице T_Mails (одна страница почтового ящика содержит только 5 строк!);затем это текущее содержимое почтового ящика для данного пользователя.

Проблема теперь заключается в следующем: поскольку оба этих вызова происходят в одной и той же функции веб-службы (и, следовательно, в одной и той же области сеанса / транзакции)почта, которую мы хотим удалить (на шаге 1), не удаляется, поскольку обновленный статус из NHibernateSession.Update (m) не достигает базы данных.

Если я открою таблицу через MSSQL ManagementStudio во время сеанса отладки, я могу видеть, что состояние почты не сохраняется в базе данных.

Моим простым решением для этой проблемы будет:вызов NHibernateSession.Flush () вручную между обновлением почты и перезагрузкой содержимого из таблицы?Но: это нарушит шаблон сеанса на разговор, так как NhibernateSession.Flush () происходит / должен происходить в конце каждого запроса - его не следует вызывать вручную где-то в текущем запросе.

В противном случаеЯ действительно застрял.

1 Ответ

1 голос
/ 30 мая 2011

Вы должны сделать 2 вызова ajax - первый, чтобы удалить элемент, и второй, чтобы обновить список, когда первый запрос будет завершен.Пожалуйста, убедитесь, что вы делаете звонки в том же порядке.Ниже приведен пример кода с использованием jQuery

$.ajax({
    url: 'Mail/Delete',
    data: { mailId: someId },
    success: function (data) {
        $.ajax({
            url: 'Mail/Refresh',
            success: function (data) {
                //here you should put new list into list container
            }
        });
    }
});
...