【发布时间】:2011-09-04 14:55:56
【问题描述】:
我们的应用程序面临一个非常奇怪的问题,直到现在我看不到解决问题的选项:
应用程序在每会话会话架构中使用 NHibernate (3.1.x),这意味着在每个 ASP/IIS 请求的开始/结束时,带有新事务的 NHibernate 会话被打开/关闭 + 刷新/提交。
现在,我们在应用程序中有一个邮箱,包括一个简单的邮件网格: 当用户进入邮箱时,第一次填充邮件网格(开始请求创建一个新的 NHibernate 会话/事务,从数据库加载内容,结束请求会话关闭)
删除邮件时出现问题:
(1) 邮件的删除不是通过完整的页面重新加载/刷新发生的,而是调用一个 web 服务,该服务在删除邮件后返回新呈现的 HTML 网格。 这个网络服务通过做一个简单的删除邮件
T_Mails m = T_Mails.GetMailByID( 12345678 );
m.Status = MailStatusDeleted;
NHibernateSession.Update( m );
(2) 在此调用更新邮件之后,相同的函数还重新呈现更新后的邮件网格 - 它通过查询表 T_Mails 中的最后 5 行来完成此操作(一个邮箱页面仅包含 5 行!);然后,这是给定用户邮箱的当前内容。
现在的问题是: 由于这两个调用都发生在 web 服务的同一个函数中(因此在同一个会话/事务范围内),我们想要删除的邮件(在步骤 1 中)不会因为来自 NHibernateSession.Update( m ) 没有到达数据库。
如果我在调试会话时通过 MSSQL ManagementStudio 打开表,我可以看到邮件的状态没有保存到数据库中。
我对这个问题的简单解决方案是: 在更新邮件和重新加载表中的内容之间进行手动 NHibernateSession.Flush() 调用? 但是:这会打破每次会话会话的模式,因为 NhibernateSession.Flush() 是/应该在每个请求结束时发生 - 它不应该在运行请求的某个地方手动调用。
否则我真的被卡住了。
【问题讨论】:
-
邮件状态更新为已删除后如何查询最后5行?
-
codeICriteria ic = CurrentSession.CreateCriteria(typeof(V_Mailbox)); ic.Add(Expression.Not(Expression.Eq("ReceiverStatusID", T_Mails.StatusDeleted))); ic.List(); code而 CurrentSession 是用于更新消息的同一会话。另一个注意事项:我没有删除表中的邮件,这不完全是:我通过在邮件行中设置标志“delete=1”使邮件对前端不可见。
标签: ajax nhibernate session flush