我一直在尝试使用临时表和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”值是调用
答案 0 :(得分:4)
默认情况下,NHibernate会为每个事务打开和关闭数据库连接。在第一个代码片段中,每个语句都在一个单独的隐式事务中执行,因此NHibernate在每个语句之后关闭连接。在第二个代码片段连接仅在您结束事务时关闭,因此在事务结束之前不会删除临时表。顺便说一句,在NH中使用隐式交易是 discouraged