在NHibernate QueryOver上从VS2010迁移到VS2017的问题

时间:2019-06-25 14:11:30

标签: c# lambda nhibernate visual-studio-2017 queryover

由于我们已将解决方案从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上打开代码,就可以正常工作。

1 个答案:

答案 0 :(得分:1)

是时候升级了。

Visual Studio 2015中Roslyn编译器的引入对表达式树中的闭包的生成方式进行了微小的更改。不幸的是,这种变化在NHibernate中是无法预料的(很难预测这种变化)。

此问题已在3.3.5 / 3.4.1 / 4.0.4中修复(问题:NH-3795)。

3.3.5版本仅在您使用的版本之上修复了2个错误,因此升级应该非常安全。