C# 每个请求的nHibernate会话在会话结束前删除并提交

C# 每个请求的nHibernate会话在会话结束前删除并提交,c#,gridview,nhibernate,C#,Gridview,Nhibernate,我在c#中使用gridview并试图删除一行。 我正在使用nHibernate,每个请求使用会话。 我的问题是,当我删除并执行row命令时,我可以删除数据库中的记录,但当我尝试重新加载数据源时,因为删除操作尚未提交,我似乎正在同一会话中获取原始数据 有人能告诉我处理这种情况的最佳策略是什么吗 非常感谢! Sid您应该运行两个事务。在WebForms中,您的代码可能如下所示: using (var transaction = Session.BeginTransaction()) { va

我在c#中使用gridview并试图删除一行。 我正在使用nHibernate,每个请求使用会话。 我的问题是,当我删除并执行row命令时,我可以删除数据库中的记录,但当我尝试重新加载数据源时,因为删除操作尚未提交,我似乎正在同一会话中获取原始数据

有人能告诉我处理这种情况的最佳策略是什么吗

非常感谢!
Sid

您应该运行两个事务。在WebForms中,您的代码可能如下所示:

using (var transaction = Session.BeginTransaction())
{
    var foo = Session.Load<Foo>(fooId);
    Session.Delete(foo);

    transaction.Commit();
}

using (var transaction = Session.BeginTransaction())
{
    gridView.DataSource = Session.List<Foo>(fooId);
    gridView.DataBind()

    transaction.Commit();
}
使用(var transaction=Session.BeginTransaction())
{
var foo=Session.Load(fooId);
删除(foo);
Commit();
}
使用(var transaction=Session.BeginTransaction())
{
gridView.DataSource=Session.List(fooId);
gridView.DataBind()
Commit();
}
正如Radim Kohler所说,如果您在MVC中以更现代的RESTful方式进行此操作,您应该让客户端对API进行两次调用—一次删除调用,然后是列表调用。但主体是相同的-您需要两个事务


我不太清楚为什么NHibernate在您的场景中不自动刷新,但是如果您根本没有打开事务,那么您可能会发现NHibernate的自动刷新功能无法正常工作。

最好的场景是拆分写入和读取操作。例如,我确实使用Delete来删除,然后重定向到MVC中的List(),或者只使用Delete方法,然后通过Web API获取。我们永远不应该把这些结合在一起。另外,Sid,检查,同时在提交之前调用explict
session.Flush()
…我正在使用HttpWebModule的每个请求会话,这将在应用程序_BeginRequest和提交时创建会话和事务,并在应用程序_EndRequest中结束会话。我想做的是错的吗?似乎当我发出delete命令时,它会删除网格,然后获取并重新绑定网格,然后在请求结束时提交整个网格。是否有一种方法可以在请求中途结束事务并提交,然后启动新事务并让应用程序_EndRequest完成重新绑定调用?@Sid是的,您应该只在开始请求和结束请求时打开会话。您应该在控制器/代码隐藏代码中打开事务。有时,每个请求打开的一个事务会有多个。交易应至少开放一段时间,并应与一项“业务行动”相关。例如,如果您在http模块中执行一些用户跟踪,您可能希望在它自己的事务中执行这些跟踪。请注意,您需要某种方式来访问请求的当前打开会话(例如,将会话变量存储在HttpContext.current.Items中)。