假设我们有 100 个 User 类型的对象,每个用户都有一个一对一的引用。NHibernate 配置中的批量大小设置为 50。因此,如果我们删除所有 100 个对象,NHibernate 将触发 200 个与数据库的连接。我想用 4 个连接删除它们,每个连接中有 50 个查询。下面的代码是我的批量插入方法的复制/粘贴,其按预期工作:
public void BatchDelete(IEnumerable<T> entitiesToDelete)
{
int batchSzie = Session.GetSessionImplementation().Batcher.BatchSize;
int batchedInsertsCount = 0;
foreach (var entity in entitiesToDelete)
{
batchedInsertsCount++;
Session.Delete(entity);
if (batchedInsertsCount % batchSzie == 0)
{
Session.Flush();
Session.Clear();
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我忘了提及我正在进行交易。
Session.Flush();
Session.Clear();
Run Code Online (Sandbox Code Playgroud)
通常表明您做错了什么,开始添加事务并删除:
if (batchedInsertsCount % batchSzie == 0)
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用删除和 in 进行查询:
// fill batch with id list of items you want to delete
_session.CreateQuery(String.Format("DELETE FROM TABLENAME WHERE Id IN (:idsList)", _domainObject.Name))
.SetParameterList("idsList", batch.ToArray())
.ExecuteUpdate();
Run Code Online (Sandbox Code Playgroud)
确保检查 2100 个最大 ID,这是您可以提供给 sqlserver 的参数的最大值。