在我目前的任务中,我需要使用一些现有的遗留代码(使用原始ADO)并使其在NHibernate下工作。我希望保持原始的sql查询,以确保完全相同的行为。
这是原始代码的作用:
(为了便于讨论,我们假设这是完全合乎逻辑的,这是需要做的事情)
问题:
我不能在单个语句中运行1 + 3,因为我在中间有BCP呼叫。因此,我被迫执行三个单独的呼叫。所以,我调用1,然后调用2,然后调用3 ......我收到有关无效对象名称#A的错误。
实际发生了什么?显然,每次查询执行后,NHibernate都会回收连接 - >使临时表#A在执行1之后立即删除(临时表存活直到连接打开)。
我需要以某种方式克服这个问题。理想情况下,我想以某种方式告诉NHibernate在此过程中始终保持相同的连接。
谢谢!
P.S。我试图在交易中执行1 + 2 + 3。这会导致BCP死锁(无论哪个IsolationLevel)
答案 0 :(得分:0)
可能还需要在事务中包装任务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可以实现更优雅的解决方案 - 如果有人能够提供这样的解决方案,那就太好了。