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: &lt;&gt;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

Документация может быть немного расплывчатой, но я считаю, что это означает, что переменные находятся в области действия метода или блока.

Просто используйте локальные переменные.

Другие вопросы по тегам