我有數據庫中兩個表之間的識別關係。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將持續子對象和集合 - 預期的行爲。但我仍然必須明確地稱呼它。
我是如何映射親子關係的錯誤?
謝謝,Firo--那就是答案。我不明白爲什麼nHibernate會保存父對象,但不保存子對象直到事務提交。這幾乎就像一個門面。我想這是一個性能優勢。 無論如何,謝謝你的偉大答案。 – 2011-12-19 18:10:24