NHibernate, дочерние объекты не лениво загружены - PullRequest
0 голосов
/ 27 ноября 2018

почему загружаются дети?

Это соотношение:

public class Order 
{

    private IList<Product> _Product;
    public virtual IReadOnlyCollection<Product> Products { get => _Product.ToList(); }
}

public class Product
{
     private IList<Item> _Item;
     protected internal virtual IReadOnlyCollection<Item> Items { get => _Item.ToList(); }
}

public class Item
{
     private string _name;
     public string Name { get => _name; }

     private decimal _quantity;
     public decimal Quantity { get => _quantity; }
}

Какой-то метод, который получает агрегат из БД

void Get(aggregateId)
{
    var q = await Session.GetAsync<TAggregate>(aggregateId, cancellationToken);

    var y = q as Order;

    if (NHibernateUtil.IsInitialized(y.Products)) /// => TRUE
}  

Конфигурации дляЗаказ и продукт

OrderConfiguration:

    mapping
        .HasMany<Product>(Reveal.Member<Order>("Products"))
        .Access.LowerCaseField(Prefix.Underscore)
        .Cascade.AllDeleteOrphan()
        .Not.KeyNullable()
        .Not.KeyUpdate()
        .LazyLoad();

ProductConfiguration

        mapping
            .HasMany<Item>(Reveal.Member<Product>("Items"))
            .LazyLoad()
            .Component(
                composit =>
                {
                    composit
                        .Map(instruction => instruction.Name)
                        .Column("Name")
                        .Not.Nullable();

                    composit
                        .Map(instruction => instruction.Quantity)
                        .Column("Quantity")
                        .Not.Nullable();
                });

Почему NHibernate eager загружает все данные, а не ожидает их загрузки только при необходимости?

Как это можно сделать ленивым?

1 Ответ

0 голосов
/ 27 ноября 2018

Использование ToList() в коллекциях _Product и _Item непреднамеренно вызывает отложенную загрузку.

...