我想要使用连贯的NHibernate将大量对象集合插入到表中,使用调用保存或更新从foreach循环中的集合中传递每个实体。我一直在设置批量大小的集合的大小,但我已阅读Ayende的博客,将其设置为较大的值不建议,所以我已经在250上限,但是当我在NHProf中查看集合时,我查看插入语句流(该集合约为20000项),而不是一组批量插入调用。使用流利的NHibernate批量插入实体集合
这看起来效率很低,所花的时间比我预期的要长得多 - 这个查询本质上是非常基本的 - 将值插入25列(是的,这是一个可以做得更好的地方,但是,这是一个遗留数据库,我现在坚持)到SQL Server 2008数据库 - 所以我只能假设我做错了。
是否有推荐的方法来插入使用NHibernate的大型实体集合?通过使用SaveOrUpdate保存可以提高效率吗?
add方法的代码 - 的SetBatchSize调用这个批封顶250,或设置为集合的大小,如果是低于250:
public void Add(IEnumerable<TEntity> entities)
{
var session = GetCurrentSession();
using (var transaction = session.BeginTransaction())
{
entities = entities.ToList();
session.SetBatchSize(SetBatchSize(entities.Count()));
foreach (var entity in entities)
session.SaveOrUpdate(entity);
transaction.Commit();
}
}
道歉稍微模糊的问题,我得到感觉我只是接近错误的方式和任何指针将不胜感激!
谢谢,我已经看过了链接,也改变了插入使用无状态会话,并且它没有作出任何差别真的。部分问题在于这是一款棕色域名应用,我无法选择生成身份。有没有办法强制NH插入记录时执行插入而不请求范围标识? – 2012-07-06 10:50:14
声明:有一种方法可以让NHibernate完成任何你想做的事情。但是 - 在这种情况下,你不能改变你的模型。我认为NH在这种情况下不是适当的工具。 – hometoast 2012-07-06 11:08:06
谢谢,这就是我想要得出的结论。我在另一个问题中特别询问了范围标识,以防万一谁知道我可以使用任何形式的魔法。 – 2012-07-06 11:36:15