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

时间:2014-11-03 14:53:08

标签: c# sql-server nhibernate

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

这是原始代码的作用:

  1. 将表A中的所有内容复制到临时表#A(使用“insert”语句)
  2. 运行外部BCP实用程序(通过命令行),它将所有内容从备份文件(.tbl)复制到表A
  3. 将所有内容从#A复制到A
  4. (为了便于讨论,我们假设这是完全合乎逻辑的,这是需要做的事情)

    问题:

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

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

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

    谢谢!

    P.S。我试图在交易中执行1 + 2 + 3。这会导致BCP死锁(无论哪个IsolationLevel)

2 个答案:

答案 0 :(得分:0)

  1. 开放会话
  2. 开始交易
  3. 启动任务1
  4. 关闭交易
  5. 启动任务2
  6. 打开交易
  7. 启动任务3
  8. 关闭交易
  9. 关闭会话
  10. 可能还需要在事务中包装任务2。

答案 1 :(得分:0)

我发现如果我通过提供连接到它的构造函数来创建会话 - 那么会话一直保持该连接。所以,这是我的快速& amp;脏"溶液:

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可以实现更优雅的解决方案 - 如果有人能够提供这样的解决方案,那就太好了。