NHibernate AliasToBean преобразователь генерирует затем псевдоним QueryOver является частным полем
Я использую NHibernate 3.3.1.4000 от NuGet в целевом проекте.net 4.5 в VS2015.
У меня есть две среды, первая env1 Windows 8.1 с VS2012 и VS2015, а вторая env2 с Windows 10 и только VS2015.
Как указано в документации QueryOver, псевдонимы могут быть:
В QueryOver псевдонимы назначаются с помощью пустой переменной. Переменная может быть объявлена где угодно (но должна быть нулевой во время выполнения). Затем компилятор может проверить, правильно ли используется синтаксис для переменной, но во время выполнения переменная не оценивается (она просто используется в качестве заполнителя для псевдонима).
Каждая функция лямбда-выражений в QueryOver имеет соответствующую перегрузку, позволяющую использовать псевдонимы, и функцию.JoinAlias для обхода ассоциаций с использованием псевдонимов без создания вложенного QueryOver.
Таким образом, это означает, что закрытое поле с нулевым значением должно работать как псевдоним.
НО... не все так просто.
У меня есть следующий пример:
public void Test()
{
TestDto testDtoAlias = null;
var users = GetSession()
.QueryOver(() => _userAlias)
.SelectList(list => list
.Select(() => _userAlias.Id).WithAlias(() => testDtoAlias.UserId)
)
.TransformUsing(Transformers.AliasToBean<TestDto>())
.List<TestDto>();
}
private class TestDto
{
public long UserId { get; set; }
}
private readonly User _userAlias = null;
который прекрасно работает на env1, но выдает исключение:
NHibernate.QueryException: could not resolve property: <>4__this._userAlias.Id of: User
на env2.
Обратите внимание, если я выбираю список идентификаторов без AleasToBean:
var users = GetSession()
.QueryOver(() => _userAlias)
.SelectList(list => list
.Select(() => _userAlias.Id)
)
.List<long>();
он работает, как и ожидалось, в обеих средах.
Любые мысли о том, что может быть причиной проблемы на env2?
Обходной путь прост, просто создайте псевдонимы в той же области, что и метод, но я хочу знать, что мне не хватает в конфигурации, поскольку пример кажется правильным.:(
2 ответа
Поэтому после некоторых трудных поисков я нашел ответ. У NHibernate были некоторые конфликты с компилятором "Roslyn", но они исправили их в следующих версиях 4.0.4, 3.4.1 и 3.3.5. Просто обновление NHibernate до одной из этой версии, исправил мою проблему.
Смотрите этот ответ /questions/46070178/chto-mozhno-ispolzovat-v-kachestve-psevdonima-nhibernate-queryover/46070199#46070199
Документация может быть немного расплывчатой, но я считаю, что это означает, что переменные находятся в области действия метода или блока.
Просто используйте локальные переменные.