Я застрял с проблемой, которая беспокоит меня некоторое время. Я использую 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 -агрегате. Я что-то здесь упустил?