为什么临时表在nhibernate中不起作用?

时间:2012-02-20 09:42:46

标签: c# nhibernate temp-tables

我一直在尝试使用临时表和nhibernate。

以下代码不起作用

query = @"CREATE TABLE [#Dataset_x]
          ([Name] [nvarchar](max) NULL,
           [Value] [nvarchar](max) NULL )";
Session.CreateSQLQuery(query).SetTimeout(uploadExecQueryTimeout).ExecuteUpdate();

query = @"INSERT INTO [#Dataset_x] ([Name],[Value]) VALUES('Dataset','MyDataset')";
Session.CreateSQLQuery(query).SetTimeout(uploadExecQueryTimeout).ExecuteUpdate();

当我尝试运行第二个查询时,我得到了对象无效错误(因为在我调用第二个查询之前创建的临时表已过期)。

但是,如果我在如下所示的交易下添加上述代码,那么它的效果非常好。

using (var transaction = Session.BeginTransaction())
{
    query = @"CREATE TABLE [#Dataset_x]
              ([Name] [nvarchar](max) NULL,
               [Value] [nvarchar](max) NULL )";

    Session.CreateSQLQuery(query).SetTimeout(uploadExecQueryTimeout).ExecuteUpdate();

    query = @"INSERT INTO [#Dataset_x] ([Name],[Value]) VALUES('Dataset','MyDataset')";
    Session.CreateSQLQuery(query).SetTimeout(uploadExecQueryTimeout).ExecuteUpdate();
    transaction.Commit();
}

有人可以建议我为什么需要在nhibernate中使用临时表进行交易吗?

注意:我在配置中使用的“current_session_context_class”值是调用

1 个答案:

答案 0 :(得分:4)

默认情况下,NHibernate会为每个事务打开和关闭数据库连接。在第一个代码片段中,每个语句都在一个单独的隐式事务中执行,因此NHibernate在每个语句之后关闭连接。在第二个代码片段连接仅在您结束事务时关闭,因此在事务结束之前不会删除临时表。顺便说一句,在NH中使用隐式交易是 discouraged