2012-10-16 76 views
3

我得到一個奇怪的錯誤在NHibernate的(V3.3),試圖堅持一個實體與可手動生成的ID時:無法確定是否實體是瞬時的或拆卸

無法確定是否{實體}與分配的標識符{Id}是暫時的或分離的;查詢數據庫。 在會話中使用顯式的Save()或Update()來防止這種情況發生。

但問題是,我使用Save代替SaveOrUpdate。可能是什麼問題呢?

+0

NHibernate中有抽象層嗎?你有任何版本/時間戳列嗎?你能發佈你的映射和代碼嗎? –

+0

最後我意識到問題是在保存父級實體時級聯子實體,在SO上有一個答案,它解釋瞭解決這個問題的可能方法。我已經修好了,但沒有時間發佈我的發現。 – Lou

+0

你會介意連接解決你的問題的答案嗎? – Firo

回答

6

原來,我的問題是實際發生的同時節省了父實體,包含子實體在一個一對多的關係:

<class xmlns="urn:nhibernate-mapping-2.2" name="ParentTable" table="ParentTable"> 

    <id name="ManuallyAssignedId"> 
     <generator class="assigned" /> 
    </id> 

    <!- child table also has a manually assigned id --> 
    <bag cascade="all" inverse="true" name="ChildTable"> 
     <key> 
     <column name="ParentTable_id"/> 
     </key> 
     <one-to-many class="ChildTable" /> 
    </bag> 

</class> 

換句話說,到Save調用父實體導致子實體的SaveOrUpdate,NHibernate抱怨。

當我意識到,我很快就發現這個StackOverflow的線程:How to save a child with assigned id in nhibernate,它有兩個很好的建議:

  1. Create and map a Version or Timestamp column - 如果它爲空,NHibernate的會知道它需要堅持的實體,或

  2. Attach a custom Interceptor to a session (or session factory)並使用自定義專用字段來跟蹤實體是否需要保持。