Массовое удаление на IList. Очистить с помощью NHibernate - PullRequest
0 голосов
/ 22 апреля 2020

Я застрял с проблемой, которая беспокоит меня некоторое время. Я использую NHibernate 5.2.7 и хочу пакетно удалить список с List.Clear(). Мой список содержит> 10 КБ, что может занять некоторое время, если есть одиночные операторы DELETE. База данных - это Microsoft SQL Server 2016, если это имеет какое-либо значение.

Небольшой пример:

public class Parent
{
    private readonly IList<Child> objs = new List<Child>();

    public IReadOnlyCollection<Child> Objs = new ReadOnlyCollection<Child>(objs);

    public async Task Do(Func<Task> saveChangesAsync)
    {
        objs.Clear();
        await saveChangesAsync();
    }
}

public class Child
{
    public virtual Parent { get; internal set; }
}

public class ParentMap : ClassMap<Parent>
{
   HasMany(p => p.Objs)
                .KeyColumn("ParentId")
                .LazyLoad()
                .Not.KeyNullable()
                .Fetch.Subselect()
                .Access.CamelCaseField()
                .Cascade.AllDeleteOrphan();
}

public class ChildMap : Map<Child>
{
    References(c=> c.Parent)
                .Column("ParentId")
                .Not.Nullable()
                .Not.LazyLoad()
                .Fetch.Join()
                .ReadOnly();
}

Теперь, если у меня есть 3 элемента в коллекции детей, и вызовите Clear() тогда это приведет к 3 DELETE операторам вместо одного. Как описано здесь: https://nhibernate.info/doc/nhibernate-reference/performance.html это должно работать. Также он не работает, когда я удаляю References в дочернем отображении (поэтому сделайте его однонаправленным). Также также отношение не инвертировано (и я попытался с inverse(true), который не работал).

Из-за Domain-Driven-Design я не хочу помещать эту логику c в другое место. Это должно остаться в моем root -агрегате. Я что-то здесь упустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...