如何防止NHibernate ISession在每次执行查询后更改连接

本文关键字:查询 连接 执行 NHibernate 何防止 ISession | 更新日期: 2023-09-27 18:28:51

在我当前的任务中,我需要使用一些现有的遗留代码(使用原始ADO),并使其在NHibernate下工作。我希望保持原始sql查询的原样,以确保完全相同的行为。

这就是原始代码所做的:

  1. 将表A中的所有内容复制到临时表#A(使用"insert"语句)
  2. 运行外部BCP实用程序(通过命令行),它将备份文件(.tbl)中的所有内容复制到表A中
  3. 将所有内容从#A复制到A

(为了便于讨论,让我们假设这是完全合乎逻辑的,这就是需要做的)

问题:

我不能在单个语句中运行1+3,因为我有BCP调用在中间。因此,我不得不执行三个单独的调用。所以,我调用1,然后调用2,然后调用3……我得到了关于无效对象名称#A的错误。

实际发生了什么?显然,在每次执行查询之后,NHibernate都会回收连接-->,这使得临时表#A在执行1之后立即被删除(临时表在连接打开之前一直有效)。

我需要以某种方式克服这个问题。理想情况下,我想告诉NHibernate在这个过程中始终保持相同的连接。

谢谢!

附言:我试图在交易中执行1+2+3。这会导致与BCP(无论哪个IsolationLevel)的死锁

如何防止NHibernate ISession在每次执行查询后更改连接

  1. 开放式会话
  2. 启动事务
  3. 启动任务1
  4. 关闭交易
  5. 启动任务2
  6. 未结交易
  7. 启动任务3
  8. 关闭交易
  9. 关闭会话

可能还需要将任务2封装在事务中。

我发现,如果我通过向会话的构造函数提供连接来创建会话,那么会话将始终保持该连接。所以,这就是我的"快速和肮脏"解决方案:

ISession dummy = factory.OpenSession();
using (ISession session = factory.OpenSession(dummy.Connection))
{
// my stuff here. the connection will remain the same across multiple query executions
}

据我所知,通过提供自定义IConnectionProvider,可以获得更优雅的解决方案——如果有人能提供这样的解决方案,那就太好了。