此 NHibernate 代码如何影响提交?



>我遇到了一个问题,以下代码导致异常。

public IList<Persoon> GetPersonenWithCurrentWorkScheme(int clientId)
{
//SELECT N+1
Session.QueryOver<Werkschema>()
.Fetch(ws => ws.Labels).Eager
.JoinQueryOver<WerkschemaHistory>(p => p.Histories)
.JoinQueryOver<ArbeidsContract>(a => a.ArbeidsContract)
.JoinQueryOver<Persoon>(p => p.Persoon)
.Where(p => p.Klant.ID == clientId)
.Future();
var result = Session.QueryOver<Persoon>()
.Fetch(p => p.ArbeidsContracten).Eager
.Where(p => p.Klant.ID == clientId)
.Future();
return result.ToList();
}

当我注释方法的第一部分(Session.QueryOver WerkSchema...(时,代码运行良好。如果未对其进行注释,则发生的第一个NHibernate.Commit()将引发异常。(带有日期时间转换的东西,但这不是我真正担心的(。

我的问题:第一段代码有用吗?它有什么作用吗?结果没有存储在稍后使用的变量中,所以对我来说它看起来像死代码。或者这是某种 NHibernate 黑魔法,实际上起到了作用?

Future是对NHibernate提供的现有API的优化。

NHibernate 2.1中最好的新功能之一是Future((和FutureValue((函数。它们本质上是一种将查询执行推迟到以后日期的方法,此时 NHibernate 将获得有关应用程序应该做什么的更多信息,并相应地对其进行优化。这建立在NHibernate的现有功能"多查询"之上,但以一种易于使用且几乎无缝的方式进行。

这将在到数据库的单次往返中执行多个查询。如果无法在单次往返中获取所有需要的数据,则会按预期执行多个调用;但在许多情况下,它仍然有帮助。

请求第一次往返时触发数据库调用。

在您的情况下,通过调用result.ToList()来请求第一次往返,其中还包括您的第一部分代码。

正如您所怀疑的,第一部分的输出;虽然检索到从未被使用过。因此,在我看来,可以安全地评论这部分。但是,这仅基于您发布的有问题的代码。

可能是此调用时加载的数据正在将往返保存在代码的其他部分中。但在这种情况下,代码应该优化并移动到正确的位置。

最新更新