2009-09-04 67 views
3

我想按照here所述的方式在WPF應用程序中實現每個商業交易模式的對話。不幸的是,這個應用程序在所有表中都有一個使用SQL Server生成的身份密鑰的大型現有數據庫每個商業交易和身份密鑰的NHibernate對話

我知道,添加一個新的對象到NHibernate會話將導致它被插入,如果它有一個身份的關鍵。即使我們還沒有完成完成整個工作單元,法比奧也會在每次請求結束時提交當前事務的模式。

如果我理解正確,這意味着我的對象將被插入到數據庫中,即使放棄工作單元也不會被刪除。所以:

  • 這種模式是否與身份密鑰不兼容?
  • 有沒有合理的解決辦法?
  • 在這種情況下,我可以使用更好的模式嗎?

編輯#1:

從法比奧一些附加的註釋是here

編輯#2:

進一步探索具有使我的堅持(...)方法,類似於保存(...)只是不同的,足以造成混淆。從hibernate FAQs採取的這種說法很有趣:

的persist()方法也保證 ,如果它被稱爲的 事務邊界之外也不會執行INSERT語句 。在長時間運行的對話中,這是有用的 擴展的會話/持久性上下文中的 。

當然,如果它確保在交易邊界內部相同,它會更有用嗎?無論如何,我都沒有使用交易的印象。

+0

我剛剛嘗試過Session.Persist(),它立即執行插入操作,儘管我沒有打開事務 - 如果這就是它的意思,它不起作用(至少在2.1上)。 – Sam 2009-09-15 02:26:40

回答

1

一種解決方法 - 您可以在您的ISession.Save s之前暫緩工作,直到您準備好完成工作單元爲止,或許作爲工作單元課程中的臨時實例集合。另外,如果您的實體被現有實體引用(並且它有意義),則可以級聯插入 - 一致地完成,這意味着您應該只需要顯式插入您的聚合根對象。這是我通常在這種情況下使用的方法。