Hibernate, Nhibernate Eager Загрузка не работает (игнорируется) - PullRequest
0 голосов
/ 06 июня 2018

Все,

Используя nhibernate 5.x, asp.net 4.6.1

У меня есть следующая ассоциация:

Адрес проекта => Проект => Регион

Я хочу запросить адрес проекта и быстро загрузить проект и регион проекта (а также страну, которая находится в проекте), ... проект загружен, но регион проекта нет!Когда я проверяю в отладчике, Region в проекте является типом прокси.Я пробовал различные запросы без успеха:

 var address = session.CreateCriteria<ProjectAddress>()
                .Add(Expression.Eq(Projections.Id(), addressId))
                .SetFetchMode("Project", NHibernate.FetchMode.Join)
                .SetFetchMode("Project.Region", NHibernate.FetchMode.Join)
                .SetFetchMode("Project.Country", NHibernate.FetchMode.Join)
                .UniqueResult<ProjectAddress>();

и

var address = session.Session.Query<ProjectAddress>()
                .Where(x => x.Id == addressId)
                .Fetch(x => x.Project)
                .ThenFetch(p => p.Region)
                .ThenFetch(p => p.Country)
                .Single();

Я делал это в других запросах, и это работает, почему это не работает в этом случае, вне меня.Здесь нет ничего особенного в отображении (Project => Region).Мое отображение:

[ManyToOne(Column = "region_id",
               ClassType = typeof(Region),
                NotNull = false)]
    public virtual Region Region
    {
        get { return _region; }
        set { _region = value; }
    }

1 Ответ

0 голосов
/ 06 июня 2018

ОК, я разобрался с проблемой.Причина, по которой Project.Region, Project.Country были прокси-серверами, заключается в том, что до загрузки адреса проекта я загружал проект в сеанс где-то еще (без активной загрузки региона / страны).Итак, после этого я загружаю адрес проекта, и hibernate больше не получает проект (следовательно, игнорирует мою стратегию выборки), а использует кэшированный проект в сеансе.Это можно проверить, вызвав Session.EvictAll () перед загрузкой адреса моего проекта.

Есть ли способ в спящем режиме явным образом указать, что нужно выполнить полный запрос (без использования Evict ())?

...