2010-03-15 57 views
2

我正在用NHibernate創建一個windows窗體應用程序。這是一個MDI應用程序,因此用戶可以同時打開多少個表單(可能很多)沒有限制。這怎麼能用(N)Hibernate完成?

對於大多數表格,我想要「確定」和「取消」按鈕。兩者都關閉表單,但「確定」也將修改的數據保存到數據庫。這些表單可能非常複雜,而且這些修改可能會觸及整個對象圖形,添加一些對象,刪除一些對象,並更改一些對象。如果可以根據需要自動檢測並保持更改,而不需要手動跟蹤每個更改,那就太好了。

什麼是一個很好的方法來做到這一點?

其他信息:我可以製作任何我想要的數據庫模式。我正在使用MSSQL 2008,目前已經決定了GUID主鍵(帶有guid.comb生成器)和一個TIMESTAMP列以實現樂觀併發。

我想簡單地設置一個NHibernate的ISessionNeverFlushMode,做所有的修改需要,然後調用Flush()如果用戶點擊OK。 But that didn't work.

回答

0

也許如果你在事務中包裝整個事物並在用戶單擊確定時提交事務?

+0

並且在用戶使用表單工作的整個過程中讓交易保持打開狀態?想想鎖定! – 2010-03-15 14:48:39

1

一些可能的解決方案,假設你使用每個表單實例一個的Isession:

  1. 呼叫如果用戶取消ISession.Clear。
  2. 將FlushMode設置爲Commit並僅在用戶單擊確定時啓動事務。
  3. 堅持使用手動FlushMode的original approach。它應該工作,你看到的行爲不是一個錯誤。

由於您使用的是主鍵的GUID,所以您不應該遇到NH意外刷新會話的問題,因爲它需要數據庫來生成標識符。您仍然需要了解在選擇之前NH可能會沖洗的情況,以確保結果一致。

我不認爲你需要擔心打開和關閉數據庫連接。我的理解是NH在管理這個方面非常好。

+0

如果這不是一個錯誤,那麼我應該如何解決它?因爲用戶創建對象的時間(比如,通過在gridview中添加一行)以及修改對象的時間並不相關(只要他願意,他可能會回來)。我應該在什麼時候保存()新的對象?我應該手動跟蹤所有新對象,並且只有在單擊確定後才能「保存()」它們? – 2010-03-15 14:57:11

+0

這不是一個錯誤,因爲它的行爲如記錄:http://knol.google.com/k/fabio-maulo/nhibernate-chapter-9/1nr4enxv3dpeq/12#9%282E%296%282E%29%28C2%29 %28A0%29Flush。當對象處於可以插入數據庫的狀態時,應該調用'Save()'。 NHibernate可能會推遲插入,直到'Flush()',或者在生成的ID的情況下,它可能會立即插入。如果用戶可以添加/更改/刪除網格中的行,那麼我會等到他們單擊確定找出需要插入的行。這取決於應用程序。 – 2010-03-15 15:34:38

+0

@Jamie Ide - 呃,確切地說。我必須自己跟蹤骯髒。或者至少插入我猜。順便說一句 - 你的意思是有記錄的?我沒有看到直接或間接提及的那種特定行爲。 – 2010-03-15 19:42:27

1

這應有助於:NHibernate Best Practices with ASP.NET, 1.2nd Ed.(我知道這是ASP.NET,但你應該找到有用的信息,並很容易轉移到的WinForms)

總之,應該選擇每個窗口架構的雪村。無法爲相同的確切任務打開兩個不同的窗口在這裏很有意義。然後,你可能想要在Form_Load()上創建一個NHibernate ISession API的實例。最後,如果用戶單擊確定,則只需執行BeginTransaction(),Flush()會話和Commit()事務,否則將其回滾。

+0

壞主意。 NHibernate事務只是ADO.NET事務的簡單包裝。你能想象如果一個交易在用戶使用表單時始終保持打開狀態會發生什麼?它會鎖定多少個數據庫表? – 2010-03-15 14:58:46

+1

你是對的,那麼我真正的意思是保持會話開放,沒有活動的事務。但是每次從數據庫加載或寫入數據庫時​​,都需要通過事務來完成。我編輯了我的答案,以反映我的意思。 – 2010-03-15 16:35:09