2012-10-16 73 views
12

我对我的ORM使用Fluent NHibernate。在这样做时,我试图使用NHibernate LINQ语法来获取一组具有LINQ功能的数据。我的代码工作并正确执行,但例外情况是,如果超过大约30秒的时间运行,则会引发超时。我的问题是如何通过NHibernate扩展LINQ语句的默认30秒超时?如何设置NHibernate的LINQ语句的超时时间

我已经看到了帖子herehere,并且here但前两个指设置的DataContext的超时属性,在这里不适用,第三是指设置在XML超时,这也是不适用因为我使用流利NHibernate来即时生成XML。不仅如此,而且这篇文章还有2年的历史,而流利的NHibernate自此也发生了变化。

随着ICriteria对象,甚至HQL我可以指定超时,但这不是目标。我想知道如何设置相同的超时并使用LINQ。

示例代码:

using (var session = SessionFactory.OpenSession()) 
    using (var transaction = session.BeginTransaction()) 
    { 
     var query = (from mem in session.Query<Member>() 
        select mem); 
     query = query.Where({where statement}); 
     int start = (currentPage - 1) * max); 
     if (start > 0) 
      query = query.Skip(start).Take(max); 
     else 
      query = query.Take(max); 

     var list = query.ToList(); 
     transaction.Commit(); 
     return list; 
    } 

此代码(where语句无所谓)适用于除非发生超时所有目的。

任何帮助表示赞赏。提前致谢!

+0

查看答案由kingpin2k。为我工作很好。 –

回答

12

我结束了为配置Fluent NHibernate设置命令超时。缺点是它为我的所有数据访问调用设置超时,而不仅仅是一个。

示例代码:

.ExposeConfiguration(c => c.SetProperty("command_timeout", (TimeSpan.FromMinutes(10).TotalSeconds).ToString())) 

我发现这个建议从this网站。

+5

你应该在设置NHibernate属性时使用NHibernate.Cfg.Environment命名空间。这样,如果关键改变了,你不会停止替换文本。对于命令超时,您可以按照Brandon的建议执行以下操作,但使用常量: '。ExposeConfiguration(C => c.SetProperty(NHibernate.Cfg.Environment.CommandTimeout,TimeSpan.FromMinutes(5).TotalSeconds.ToString())' –

+0

我试图做同样的。没有工作,它仍然需要30秒的默认值 – Zuber

0

我刚刚花了很多时间相当与此战斗,并希望这将节省别人一些时间。

您应该在最后时刻使用.Timeout(120)方法调用来确保它被使用。 TBH我为什么这是不是100%肯定,但这里有一些例子:

将工作

query = query.Where(x => x.Id = 123); 

var result = query.Timeout(120).ToList(); 

不起作用

query.Timeout(120); 

query = query.Where(x => x.Id = 123); 

var result = query.ToList(); 

如果像第二完成(没有按” T WORK)的例子,它似乎回落到默认的System.Transaction.TransactionManager.DefaultTimeout。

+0

后查询在$工作为我们工作。 – Malcolm

+0

快乐的人证明我错了适当的测试,但我这样做手动多次复制它每一次。我同意查询后,将工作,只要你不添加额外的Where子句,然后执行'.ToList();' –

+2

我认为你需要重新分配变量 查询= query.Timeout(120); –