我们的应用程序遇到了一个非常奇怪的问题,直到现在我看不到解决问题的方法:
应用程序在每会话会话体系结构中使用NHibernate(3.1.x),这意味着在每个ASP / IIS请求的开始/结束时,打开/关闭+刷新/提交新事务的NHibernate会话。 p>
现在,我们在应用程序中有一个邮箱,包括一个简单的mailgrid: 当用户进入邮箱时,第一次填充mailgrid(start-Request创建一个新的NHibernate会话/事务,从DB加载东西,最后请求会话关闭)
删除邮件时会出现问题:
(1) 删除邮件不会通过完整页面重新加载/刷新发生,而是调用web服务,该服务在删除邮件后返回新呈现的HTML网格。 此Web服务通过执行简单的
删除邮件T_Mails m = T_Mails.GetMailByID( 12345678 );
m.Status = MailStatusDeleted;
NHibernateSession.Update( m );
(2) 在此次调用更新邮件之后,同样的函数也会重新呈现更新的mailgrid - 它通过查询表T_Mails中的最后5行来实现这一点(一个邮箱页面只包含5行!);那么,这是给定用户的邮箱的当前内容。
现在的问题是: 由于这两个调用都发生在webservice的相同功能中(因此在相同的会话/事务范围内),因此从NHibernateSession.Update(m)更新状态后,我们要删除的邮件(在步骤1中)不会被删除)没有到达数据库。
如果我通过MSSQL ManagementStudio打开表,而调试会话我可以看到邮件的状态不会持久存储到数据库。
我对此问题的简单解决方案是: 在更新邮件和从表中重新加载内容之间进行手动NHibernateSession.Flush()调用? 但是:这会破坏每个会话的会话模式,因为NhibernateSession.Flush()应该在每个请求结束时发生 - 它不应该在正在运行的请求中的某个地方手动调用。
否则我真的卡住了。
答案 0 :(得分:1)
你应该进行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
}
});
}
});