мы сталкиваемся с очень странной проблемой с нашим приложением, до сих пор я не вижу возможности решить эту проблему:
Приложение использует 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 () происходит / должен происходить в конце каждого запроса - его не следует вызывать вручную где-то в текущем запросе.
В противном случаеЯ действительно застрял.