我正在尝试使用批量查询和并行处理导入一些大文件,而且我经常遇到错误,如
NHibernate.HibernateException: identifier of an instance of xxx was altered from ... to ...
我知道我根本没有修改我的主键。我使用的是NH 2.1.x GA,ThreadStaticSessionContext,每个文件都在一个单独的线程中处理(使用ThreadPool),文件中的信息是非核心的。我确实为每个文件都有一个会话和一个事务,但我根本没有刷新会话。在同一个线程中,我提交了事务并关闭了会话,但是这个错误让我感到很沮丧。
如果您有任何建议......
答案 0 :(得分:3)
就我而言,我对同一个问题有不同的解决方案。我看到的错误如下:
NHibernate.HibernateException:XXXX实例的标识符 从9变为9
问题是我已将映射XML文件中的标识符(“id”列)从“Int64”更改为“Int32”但我忘记将数据类从Int64切换到Int32。这解释了NHibernate无法用“9”改变“9”的ID这一事实。第一个“9”是Int64,但它期待一个“Int32”。我希望能有所帮助。
答案 1 :(得分:1)
将您的ID属性设置为:
public int ID {get;私人集; }
这样你就无法改变它。
检查ID类型是否与数据库中的类型相同。 (如果数据库有一个int字段,你将它设置为long字段,那么nHibernate认为它已经改变了。
如果您使用PK身份,请将其更改为Hi-Lo或其他内容。有很多关于在SQL Server中不使用身份的讨论。在某些情况下,它可能会失败。
答案 2 :(得分:0)
为了解决这个问题,我认为由于编码技巧不佳(使用跨多个线程的共享资源而不考虑conccurency)以及主键上的身份而发生错误。
代码中没有我自己设置或更改主键值的地方。