2010-08-07 130 views
2

我對使用存儲庫有一個簡短的問題。但要問最好的辦法是表現出位的僞碼和你們告訴我什麼結果應該存儲庫模式

  • 從儲備庫中獲得創紀錄的ID爲1(假設它存在)

  • 編輯幾個屬性

  • 查詢與1個

  • 結果的ID的項目再次存儲庫=佔地

我應該得到使用更新的值對象或無(原始狀態)的對象,銘記,因爲更新的屬性(步驟2)的值我還沒有告訴庫更新此記錄。

我想我應該得到一個原始項目的副本,而不是對編輯版本的引用。

請告訴我什麼是正確的。

乾杯

回答

0

從你我假設你過去的問題來看使用LINQ/C#?

如果您使用的是DataContext並且您還沒有調用SubmitChanges()那麼您應該找回原始未更改的對象。

剛剛測試過它。我錯了,你找回了改變的對象。
如果您在DataContext上設置了ObjectTrackingEnabled = false,則會得到未更改的對象。

+0

嘿,好猜。我首先使用Entity Framework代碼,但是在設計TestDataContext(將實體存儲在內存中)時,它實際上讓我思考了所需的行爲。 – nick 2010-08-07 17:29:40

2

存儲庫模式假設像您的對象的集合,所以理想情況下,我認爲它應該返回相同的對象實例,它會有更新。

通常在某處存在標識映射,因此您的存儲庫可以跟蹤已經加載的內容。使用身份映射,當您使用相同的ID獲取對象時,無論次數多少,您都應該獲取已加載的對象。這就是所有更復雜的ORM的工作方式,通常是一個很好的做法。身份地圖可幫助您在同一事務中保持同步併爲您節省一些數據訪問權限。

NHibernate的會話有一個它跟蹤的身份映射,所以你不必擔心試圖在你的倉庫中實現自己的身份。此外,我相信你可以使用NHibernate的無狀態會話,如果你想加載另一個實例沒有更改跟蹤,但我不積極。

+0

有道理,但最初對我們這些習慣於以舊時尚方式做事的人來說很直觀。我想不小心使用一個靜態的DataContext是一個很好的方式來結束你的應用程序中的一些瘋狂的數據。 – jwsample 2010-08-07 18:43:59

+0

如上所述,它是爲您照顧的身份地圖。如果您完全使用單獨的DbContext實例,則除非先保存更改並從另一個請求對象,否則不會看到該行爲。它的設計是這樣的。 – ssmith 2016-02-10 03:05:58