2011-07-09 30 views
0

NHibernate的Session和EF的ObjectContext是工作單元模式的實現,並提出了類似的變更跟蹤方法:您檢索一些實體,然後在調用SaveChanges/SubmitChanges/Save /之後修改它們。擺脫UoW的隱含性

我不喜歡這種方法的隱含性。我不喜歡該實體修改自動意味着它將被保存。我想明確標記應該保存的實體。在NHibernate或EF中實現這種控制的最佳方法是什麼?

+0

當你不想改變它們的時候,你改變實體的原因是什麼? – Steven

+0

例如,用戶在桌面應用程序的用戶界面中修改了多個實體,並在保存之前決定取消對其中一個實體的修改。或者我可能只是想修改一些屬性爲UI顯示的原因。 – SiberianGuy

+0

你想要的是與單位工作模式的想法背道而馳。我認爲你應該將這些實體分離到他們自己的工作單元中。 – Steven

回答

1

(注:幸運的是我從來沒有處理EF,我的答案是約NH只)
我認爲你最初的假設是錯誤的:

實體修改自動 意味着它將被保存

那是不正確的;爲了堅持你做你的更改需要:

  1. 調用調用Session.flush()自己
  2. 設置會話的刷新模式爲AutoCommit(強烈不推薦)
  3. 使用ITransaction並提交它(迄今爲止最好的方法)。

除非您執行以上任何操作,否則您的更改將不會被保留。
就我個人而言,我覺得NH讓我完全控制進入我的數據庫的內容。

here'是一篇好文章。

+0

通過「自動」我的意思是在UoW保存(也稱爲會話刷新)期間自動執行,正如您所描述的那樣 – SiberianGuy

+0

@Idsa:所以我猜你的問題是''session.Flush()'flush * all * db,而不僅僅是你想要的?如果使用交易可以幫助您控制這一點。這是爲什麼顯式使用事務優於Flush的原因之一。 –