2009-08-17 48 views
0

我使用NHibernate作爲我的ORM。我有一種情況,我在ITransaction中包裝了一些東西。我正在監聽NHibernate中的SaveUpdate事件,然後在SaveUpdate處理程序中進行實體驗證。NHibernate - 驗證和交易的問題

對於我的一個實體,我想驗證某個屬性的值沒有改變。所以我想,我會加載數據庫中現有對象的值,並將其與新值進行比較。問題是我調用了ITransaction.Commit()來保存我的實體對象,並且事務在驗證發生時並未實際提交,所以我無法從數據庫加載現有對象,因爲事務已將其鎖定。

所以我想我在這裏有幾個不同的問題: - SaveUpdate事件是否是驗證的正確位置? - 有沒有另外一種方法可以做到這一點,以便我可以做我需要做的驗證(從數據庫中獲取現有值並進行比較)?

我確定有人在那裏遇到類似的情況......希望!

回答

0

如果您想查看如何進行驗證的示例,我建議您查看ScottGu的NerdDinner。儘管他使用Linq to SQL來實現他的ORM,但是很容易將其適用於NHibernate。

我最近在ASP.NET MVC + NHibernate項目中使用了類似於NerdDinner的驗證系統,並取得了巨大成功。

0

驗證與持久性無關,所以saveupdate不是正確的地方。驗證的正確位置取決於:要驗證的內容,編程風格,用於顯示驗證消息的UI框架等。就個人而言,我更願意將驗證放在事物發生變化的地方,所以我會把它放在設置屬性的更改方法中。我不明白你爲什麼要加載前一個狀態的實體,因爲這個狀態在第一次加載時已經加載。

+0

我不同意。我最終希望在保存之前驗證我的實體,所以我認爲它確實與持久性有關。對屬性進行驗證適用於簡單情況,但有時驗證規則不僅僅涉及單個實體(例如,銀行帳戶只能擁有一個主要帳戶持有者)。 – 2009-08-18 13:02:07

+0

這不是不使用方法來更改實體中的事物的原因。聚合根應該負責驗證它的子實體。 – Paco 2009-08-18 13:55:27

+0

但是當我保存一個聚合根的子實體時呢? – 2009-08-18 14:08:22