Проблемы при переходе с VS2010 на VS2017 в NHibernate QueryOver - PullRequest
0 голосов
/ 25 июня 2019

Поскольку мы перенесли наши решения с VS2010 на VS2017, лямбда-выражение NHibernate QueryOver не работает должным образом. После различных тестов я обнаружил, что при удалении 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 Ответ

1 голос
/ 27 июня 2019

Пора обновить.

Внедрение компилятора Roslyn в Visual Studio 2015 внесло небольшие изменения в способ генерации замыканий в деревьях выражений.К сожалению, это изменение было непредвиденным в NHibernate (предсказать такие изменения действительно сложно).

Это исправлено в 3.3.5 / 3.4.1 / 4.0.4 (ошибка: NH-3795 ).

В версии 3.3.5 исправлено только 2 ошибки в верхней части используемой версии, поэтому обновление должно быть чрезвычайно безопасным.

...