0

我正在处理的 MVC 3 项目提交/回滚我在当前会话结束时所做的任何插入/更新调用。这在大多数情况下都可以正常工作,除了现在我正在做多个插入。

当 csv 上传到站点时,每条记录都会被解析并插入到数据库中。问题是,如果一条记录插入失败,所有以前的记录都会回滚,并且所有后续尝试都会失败并出现错误:

    don't flush the Session after an exception occurs

如何禁用每个会话的请求(或者我是否必须以某种方式“重新启动”事务)?

编辑:详细信息

每个请求的会话内容是在实现 IHttpModule 的类中配置的。此类采用 HttpApplication 上下文和 UnitOfWork 类。这是提交和回滚发生的地方。

上面提到的 UnitOfWork 是使用 StructureMap 注入到存储库中的。

就像我说的,这种行为对于 99% 的站点其余部分来说都很好,我只需要获取此批量更新以忽略每个请求的会话事务。或者我需要为每条新记录手动重新启动事务。我只是不知道怎么做。

4

2 回答 2

0

每个请求的会话内容是在实现 IHttpModule 的类中配置的。

您在 HttpModule 中启动的每个请求的会话是执行的操作,而不是 NHibernate。如何禁用它,取决于您的代码。我个人不喜欢在某个 UnitOfWork-class 中抽象 NHibernate,因为现在您意识到您使用的抽象还不够好,而肮脏的 hack 可能是现在唯一的方法。

您实际上想要做的(并且不推荐)是:

foreach (var row in rows)
{
    using (var session = SessionFactory.OpenSession())
    using (var tx = session.BeginTransaction())
    {
         var whatever = ...
         session.Save(whatever);
         tx.Commit();
    }
}
于 2012-07-25T09:14:36.580 回答
0

ISession具有FlushMode默认值的属性Auto

自动 ISession 有时会在查询执行之前被刷新,以确保查询永远不会返回过时状态。这是默认的刷新模式。

提交 调用 Transaction.Commit() 时刷新 ISession

从不 除非应用程序显式调用 Flush(),否则永远不会刷新 ISession。这种模式对于只读事务非常有效

未指定 的未指定刷新模式的特殊值。

总是在每次查询之前刷新 ISession。这几乎总是不必要且低效的。

尝试更改ISession's FlushMode属性Commit值。

于 2012-07-19T21:26:13.103 回答