2011-12-17 70 views
1

我有數據庫中兩個表之間的識別關係。HasOne識別關係不保存

父表具有通過標識生成的主鍵。子表具有主鍵,該主鍵是來自父表的由身份生成的主鍵。這是一個真正的一對一。

我試過幾種映射策略,有各種結果,都沒有完美。

父映射文件本(注意Cascade.All() - 我希望家長來管理關係):

HasOne(x => x.ChildObject).Cascade.All(); 

的子映射具有這樣的:

Id(Reveal.Member<ChildObject>("ID")) 
.GeneratedBy.Foreign("ParentObject"); 
HasOne(Reveal.Member<ChildObject, ParentObject>("ParentObject")) 
.Constrained() 
.ForeignKey(); 

我改變了對象名稱以保護無辜者。

這就是發生了什麼。我創建了父對象的一個​​實例,我創建了一個孩子的實例並設置了關係(將孩子添加到父項,將父項添加到孩子)。

我運行此代碼:

session.SaveOrUpdate(_Parent); 
session.Clear(); 
transaction.Commit(); 

我希望發生的是父母得到保存,與ID從數據庫父被更新。然後在兒童中設置ID,並保存孩子。

取而代之,Parent被保存,但不是Child(我可以看到插入語句nHibernate正在執行,並且Child對象從不出現在數據庫中)。

孩子有來自父母的ID(它正在從父母傳播到孩子正確),但nHibernate不認爲孩子是骯髒的(我的一個猜測)。即使我在Child對象上顯式地嘗試SaveOrUpdate,它也不會被保存。

但它有點怪異。如果我將一系列髒對象附加到子對象上,並且我在子對象上調用SaveOrUpdate 明確,則nHhiberante將持續子對象和集合 - 預期的行爲。但我仍然必須明確地稱呼它。

我是如何映射親子關係的錯誤?

回答

1

我的猜測是parent.Id是由身份生成的。

session.SaveOrUpdate(_Parent);將保存父級以獲取其ID並緩存插入子級以在提交時刷新。 session.Clear();然後將刪除緩存的插入和transaction.Commit();不會找到任何事情要做。

+0

謝謝,Firo--那就是答案。我不明白爲什麼nHibernate會保存父對象,但不保存子對象直到事務提交。這幾乎就像一個門面。我想這是一個性能優勢。 無論如何,謝謝你的偉大答案。 – 2011-12-19 18:10:24