2009-10-22 19 views
3

我想知道是否有辦法讓一個實體的實例在運行時不可變。我知道我可以有隻讀類型,但是我希望在運行時只讀類型的實例。原因是,我希望通過修改屬性來使用NH域對象(如輕量級實體),但不希望在執行Session.Flush()或類似操作時保留這些更改。總是存在Session.Evict(),但這不會阻止來自Session.Save()的未知開發人員在「只讀」實體上工作。NHibernate只讀實體在運行時

+0

我有2個問題: 1.爲什麼以及何時需要實體的只讀版本? 2.「運行時間」何時開始? – Paco

+0

「爲什麼」 - 因爲在某些情況下,我們希望在內存中保留一個對象的狀態而不需要堅持數據庫。大多數純粹主義者會爭辯說,你創建了一個單獨的輕量級實體,但在簡單情況下,我認爲這不太實用。我不喜歡NH的一件事是沖洗自動持續改變狀態,這是一個陳述的設計原則。我*喜歡*使用明確的陳述來堅持我的對象,這就是爲什麼我被Mauricio Scheffer的答覆所吸引。 「你什麼時候需要readonly版本的實體......何時'runtime'開始?」 - 加載後 – Trent

回答

5

在運行時間吧?我還是有點不解帶,究竟你問,但我已經做了這樣的事情在過去的:

foreach (var order in orders) 
{ 
    _nhSession.SetReadOnly(order, true); //prevent database updates 
} 

我這樣做了一段時間後,因爲當我查詢訂單的名單,一些實體的財產不應當爲空。因此,當NHibernate做了flush操作時,它試圖更新我的所有命令,並將數據庫中爲空的幾個字段設置爲默認的C#值,例如數據庫中的Integer字段設置爲NULL,在C#中將更改爲0 。

1

看看this article by Fabio Maulo,你可以用它作爲起點,並改變它來跟蹤個體實體。

+0

這是一個有趣的事情要考慮。我們不能在我們的解決方案中使用這個功能,並在現有刷新行爲上使用遺留依賴關係然而,我喜歡看鉤子在哪裏進入實例狀態,這可能會激發我爲NH爲GetReadOnly或ListReadOnly <>或類似的東西添加重載。 – Trent