NHibernate标识符改变了异常

时间:2010-01-08 11:50:55

标签: sql-server nhibernate fluent-nhibernate c#-3.0

我正在尝试使用批量查询和并行处理导入一些大文件,而且我经常遇到错误,如

NHibernate.HibernateException: identifier of an instance of xxx was altered from ... to ...

我知道我根本没有修改我的主键。我使用的是NH 2.1.x GA,ThreadStaticSessionContext,每个文件都在一个单独的线程中处理(使用ThreadPool),文件中的信息是非核心的。我确实为每个文件都有一个会话和一个事务,但我根本没有刷新会话。在同一个线程中,我提交了事务并关闭了会话,但是这个错误让我感到很沮丧。

如果您有任何建议......

3 个答案:

答案 0 :(得分:3)

就我而言,我对同一个问题有不同的解决方案。我看到的错误如下:

  

NHibernate.HibernateException:XXXX实例的标识符   从9变为9

问题是我已将映射XML文件中的标识符(“id”列)从“Int64”更改为“Int32”但我忘记将数据类从Int64切换到Int32。这解释了NHibernate无法用“9”改变“9”的ID这一事实。第一个“9”是Int64,但它期待一个“Int32”。我希望能有所帮助。

答案 1 :(得分:1)

  1. 将您的ID属性设置为:

    public int ID {get;私人集; }

    这样你就无法改变它。

  2. 检查ID类型是否与数据库中的类型相同。 (如果数据库有一个int字段,你将它设置为long字段,那么nHibernate认为它已经改变了。

  3. 如果您使用PK身份,请将其更改为Hi-Lo或其他内容。有很多关于在SQL Server中不使用身份的讨论。在某些情况下,它可能会失败。

答案 2 :(得分:0)

为了解决这个问题,我认为由于编码技巧不佳(使用跨多个线程的共享资源而不考虑conccurency)以及主键上的身份而发生错误。

代码中没有我自己设置或更改主键值的地方。