Вы слишком усложняете это.
Просто настройте желаемый размер пакета, сделайте все необходимые Session.Delete
вызовы и затем подтвердите вашу транзакцию.
NHibernate выполнит entitiesToDelete.Count() / batch size
запросов.
Вот пример кода:
using (var session = sessionFactory.OpenSession())
using (var tx = session.BeginTransaction())
{
foreach (var foo in session.Query<Foo>())
session.Delete(foo);
tx.Commit();
}
И пример конфигурации:
var config = new Configuration();
config.SessionFactory()
.Integrate.Using<MsSql2008Dialect>().Connected.Using("...")
.BatchingQueries.Each(10);
(Я устанавливаю явное значение для размера пакета, но NH 3,2по умолчанию 20 IIRC)
Если имеются каскадные коллекции, необходимо убедиться, что удаления обрабатываются БД.
Вам необходимо определить FK как ON DELETE CASCADE
и разрешить NHзнать об этом:
<class name="Foo">
<id ...>...</id>
<bag name="Bars" inverse="true" cascade="all">
<key column="FooId" on-delete="cascade" />
<one-to-many class="Bar" />
</bag>
</class>
<class name="Bar">
<id ...>...</id>
<many-to-one name="Foo" column="FooId" />
</class>
В этом случае Foo
имеет коллекцию Bars
, сохраненную в столбце FooId
.