Nano Hash - криптовалюты, майнинг, программирование

NHibernate: не удается установить отложенную загрузку

У меня есть таблица Parent и таблица Child. Дочерний элемент содержит внешний ключ для родительской таблицы, создавая отношение «один ко многим». Вот часть моего отображения, которое я определяю с помощью беглого NHibernate:

public class ParentMap : ClassMap<Parent>
{
    public ParentMap()
    {
        WithTable("Parents");

        Id(x => x.Id, "ParentID")
        .WithUnsavedValue(0)
        .GeneratedBy.Identity();

        Map(x => x.Description, "Description");

        HasMany<Child>(x => x.Childs)
        .LazyLoad()
        .WithKeyColumn("ParentID")
        .IsInverse()
        .AsSet();
    }
}

public class ChildMap : ClassMap<Child>
{
    public ChildMap()
    {
        WithTable("Childs");

        Id(x => x.Id, "ChildID")
        .WithUnsavedValue(0)
        .GeneratedBy.Identity();

        References(x => x.Parent, "ParentID")
            .CanNotBeNull()
            .LazyLoad();
    }
}

Как видите, я установил для отношения LazyLoad. Также обратите внимание, что в моих классах модели все свойства установлены как виртуальные.

Теперь простой запрос:

ICriteria crit = Session.CreateCriteria(typeof(Child))
    .Add(Expression.Eq("Id", 18));
IList<Child> list = crit.List<Child>();

И сгенерированный SQL:

SELECT this_.ChildID            as ChildID5_1_,
       this_.ParentID           as ParentID5_1_,
       parent2_.ParentID    as ParentID4_0_,
       parent2_.Description as Descript2
ICriteria crit2 = Session.CreateCriteria(typeof(Child))
    .SetFetchMode("Parent", FetchMode.Lazy)
    .Add(Expression.Eq("Id", 18));
0_ FROM Childs this_ inner join Parents parent2_ on this_.ParentID = parent2_.ParentID WHERE this_.ChildID = 18 /* @p0 */

Как видите, он выполняет соединение с родительской таблицей и выбирает ее поля (идентификатор и описание). Но почему он это делает, если я запросил ленивую загрузку?

Теперь, если я изменю запрос на:

ICriteria crit2 = Session.CreateCriteria(typeof(Child))
    .SetFetchMode("Parent", FetchMode.Lazy)
    .Add(Expression.Eq("Id", 18));

Сгенерировано 2 sql-запроса:

SELECT this_.ChildID  as ChildID5_0_,
       this_.ParentID as ParentID5_0_
FROM   Childs this_
WHERE  this_.ChildID = 18 /* @p0 */

что мне хорошо: нет соединения, родительская таблица не запрашивается. Но я тоже получаю и второй:

SELECT parent0_.ParentID    as ParentID4_0_,
       parent0_.Description as Descript2_4_0_
FROM   Parents parent0_
WHERE  parent0_.ParentID = 45 /* @p0 */

который снова запрашивает родительскую таблицу.

Эти 2 запроса генерируются в строке:

IList<Child> list = crit.List<Child>();

Я совершенно не понимаю, что здесь происходит. Может кто поможет?


Ответы:


1

Это будет зависеть от вашей версии Fluent NHibernate. До определенного момента по умолчанию все объекты не загружались с ленивой загрузкой. Это эквивалент явной установки lazy="false" в вашей сущности. Это уже не так, но если вы выполняете что-либо до этого момента, вы увидите такое поведение.

Настройка отложенной загрузки «многие к одному / ссылки» переопределяется ленивой загрузкой уровня сущности от цели, поэтому, если вы используете эту старую версию FNH, настройка сущности будет отображать ваш References(...).LazyLoad() вызов спорным.

Вам необходимо убедиться, что вы используете последнюю версию FNH, это должно исправить ситуацию; однако, если это не так, вам нужно явно включить отложенную загрузку в вашей Parent сущности. Вы можете сделать это с помощью метода LazyLoad на ClassMap<T>.

26.01.2009
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..