NHibernate批量插入而不在末尾选择ID

时间:2012-02-13 01:59:41

标签: .net nhibernate fluent-nhibernate

我一直在玩几种方法来批量插入10,000个对象的列表到我的数据库中。

这些对象没有任何关系,只存储POCO数据。

我已经开始使用StatelessSession,正如许多文章所建议的那样,我注意到了明显的改进。

有一件事仍然存在 - 在每次插入后,NHibernate执行SELECT语句以获取刚刚插入的对象的ID。有没有办法推迟到我要实际查询对象时?如果NHibernate只是插入行而不用担心ID,那么这似乎是一个巨大的性能优势。

这可能吗?

2 个答案:

答案 0 :(得分:2)

不可能,有时值得考虑适合这项工作的工具。如果您的表上有一个标识列,则NHibernate ALWAYS会跟随一个带有插入的select,即使BULK插入也是如此。另一件需要考虑的事情是,您的一级缓存将变得非常大(除非您使用无状态会话),这可能会导致其他复杂情况。

我理解你的观点想要使用NHibernate的优点,但有时我们无法避免使用其他工具......

如果我需要将10K插入内容发送到我的数据库中,我将使用SQlBulkCopy类并完全绕过NHibernate。

  

SQLBulkCopy可让您有效地批量加载SQL Server表   来自其他来源的数据。

请参阅here for more信息

答案 1 :(得分:0)

您可以更改ID生成以使用guid或其他一些服务器端计算类型,因此sql不需要像您已经知道的那样返回id,只需在插入的SQL查询中传递它们

有关可用方法的详细信息,请参阅this

this对发电机进行了更深入的解释