2010-01-08 46 views
4

我試圖導入使用批量查詢和處理相同常一些大的文件,我經常收到類似NHibernate的標識改變例外

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

錯誤,我知道我沒有改變我的主鍵在所有。我使用NH 2.1.x GA,ThreadStaticSessionContext,每個文件在一個單獨的線程中處理(使用ThreadPool),並且文件中的信息是不相關的。我對每個文件都有一個會話和一個事務,但是我根本不會沖洗會話。在同一個線程中,我正在提交事務並關閉會話,但是這個錯誤讓我感到困惑。

如果您有任何建議...

回答

0

剛剛關閉這一點,我認爲是因爲糟糕的編碼技術(使用共享資源跨越多個線程,而對照顧發生錯誤並且在主鍵上的標識

在我設置或改變pr的代碼中沒有地方Imary關鍵值由我自己。

1
  1. 設置你的ID屬性爲:

    公衆詮釋ID {獲得;私人設置; }

    這樣你就不能改變它了。

  2. 檢查ID類型是否與數據庫中的類型相同。 (如果數據庫有一個int字段,並且你將它設置爲長字段,那麼nHibernate認爲它已經改變了。

  3. 如果你使用PK的身份,將它改爲Hi-Lo或其他東西。說起在SQL Server中不使用標識。在某些情況下,它可能會失敗。

+0

我認爲這是由主鍵,身份造成的。 – DaeMoohn 2010-01-11 20:33:13

2

在我的情況下,我對同樣的問題有不同的解決方案。我看到錯誤是以下幾點:

NHibernate.HibernateException:XXXX實例的標識是 從9變更爲9

的問題是,我已經改變了標識(「ID」列)映射XML文件從「Int64」到「Int32」,但我忘了將數據類從Int64切換到Int32。這解釋了NHibernate無法用「9」來改變「9」的ID的事實。第一個「9」是一個Int64,但它期待着一個「Int32」。我希望能幫助別人。