由于我们已将解决方案从VS2010迁移到VS2017,因此NHibernate QueryOver的lambda表达式无法正常工作。经过各种测试,我发现删除了JoinAlias(但是从代码中显式删除了它是否执行是独立的),代码工作正常。
在调试NHibernate(3.3.3SP1)之后,我发现区别在于联接(一个表达式)的别名,在坏情况下它被检测为MemberAccess,并且对应的字符串很奇怪。
我将尝试显示代码的相关部分,但是单独测试可以正常工作:
LiquidacionDao.cs
Poliza aliasJoinCia = null;
this.Session.QueryOver<Recibo>(() => recibo)
.Inner.JoinQueryOver<Poliza>(r => r.Poliza, () => aliasJoinCia);
...
...
...
// If I remove those lines, the code works
GestorDeCobro aliasJoinGestoresCobro = null;
queryOver.Inner.JoinAlias(r => r.GestorDeCobro, () => aliasJoinGestoresCobro);
...
...
return queryOver.List();
调试JoinQueryOver和JoinAlias,我已经看到,当它工作时(没有最后几行),调试器会在监视中显示以下字符串:
{() => value(mpm.seg.Dao.Recibos.Liquidaciones.LiquidacionDao+<>c__DisplayClass33_0).aliasJoinCia}
和属性“ DebugView”:
.Constant<mpm.seg.Dao.Recibos.Liquidaciones.LiquidacionDao+<>c__DisplayClass6_0>(mpm.seg.Dao.Recibos.Liquidaciones.LiquidacionDao+<>c__DisplayClass6_0).aliasJoinCia
当失败时,手表将显示以下字符串:
{() => value(mpm.seg.Dao.Recibos.Liquidaciones.LiquidacionDao+<>c__DisplayClass33_3).CS$<>8__locals1.aliasJoinCia}
和属性“ DebugView”:
.Lambda #Lambda1<System.Func`1[mpm.seg.ServiceModel.DataContracts.Polizas.Poliza]>() {
(.Constant<mpm.seg.Dao.Recibos.Liquidaciones.LiquidacionDao+<>c__DisplayClass34_3>(mpm.seg.Dao.Recibos.Liquidaciones.LiquidacionDao+<>c__DisplayClass34_3).CS$<>8__locals1).aliasJoinCia
}
我无法理解为什么在某些情况下表达式的解释会有所不同,仅在Visual Studio 2017中,如果我在Visual Studio 2010上打开代码,就可以正常工作。
答案 0 :(得分:1)
是时候升级了。
Visual Studio 2015中Roslyn编译器的引入对表达式树中的闭包的生成方式进行了微小的更改。不幸的是,这种变化在NHibernate中是无法预料的(很难预测这种变化)。
此问题已在3.3.5 / 3.4.1 / 4.0.4中修复(问题:NH-3795)。
3.3.5版本仅在您使用的版本之上修复了2个错误,因此升级应该非常安全。