2014-10-06 33 views
3

我有一個View Model,我創建並返回到我的視圖。這個視圖模型沒有被緩存。 但是,視圖模型包含緩存的「類別」類型的列表。ASP.NET MVC 5數據緩存 - 不像我期望的那樣行爲

我按照慣例「如果在緩存中檢索並返回,如果不在緩存中,則檢索數據,存儲在緩存中並將視圖模型返回給控制器。這按預期工作。

我的問題就在我將我的視圖模型從控制器返回到我的視圖之前我想更新類別列表中的記錄,但僅針對調用它的頁面(不適用於所有調用它的用戶/頁面) 。當我這樣做時,它會自動更新緩存中的類別列表,我不希望它。我只插入緩存一次,所以不明白爲什麼當我從緩存中檢索到更新列表後,更改會立即反映在緩存中。

這可能是我誤解OO/Cache的工作原理,但希望有人能夠讓我直說?

在我的控制器中的代碼...

var vm = new FsmViewModel(); 
if(vm.ActiveCategoryId > 0) 
vm.Categories.Find(c => c.Category_ID == vm.ActiveCategoryId).ActiveBootstrapCss = "active"; 

上面的代碼也更新類我已經存儲在緩存中的列表?我正在使用代理模式來填充緩存或數據庫中的類別列表。

ObjectCache cache = MemoryCache.Default; 
_categories = (List<Category>)cache[CacheForCategories]; 

if (_categories != null) return _categories; 

// Cache does not exist so create 
var policy = new CacheItemPolicy {AbsoluteExpiration = DateTimeOffset.Now.AddHours(4)}; 

_categories = base.GetAllCategories(); 
cache.Add(CacheForCategories, _categories, policy); 

return _categories; 

_categories返回到我的視圖模型從高速緩存或DB拉,在我看來模型對象定義爲

public List<Category> Categories { get; set; } 

有人可以請讓我知道我做錯了什麼?

感謝,

保羅

回答

5

你沒有做錯什麼。這就是緩存的工作原理。它包含對象的引用而不是它的副本。所以如果你從緩存中加載一個對象,那麼它基本上是同一個對象,因爲你只會收到對它的引用。

在將其保存在緩存中以避免此行爲之前,您可以先製作一個deep copy of your object

+0

「深層複製」這對我來說是新的。所以我猜如果我發現了一個新的對象類似...類別=新列表(cachedDbRepository.GetAllCategories());這不會工作,因爲它仍然會引用原始對象?將回到我的辦公桌後發表我的發現。 – 2014-10-06 22:19:55

+0

經過一番思考,現在變得非常有意義。 Thankyou爲我設置直線。 – 2014-10-06 22:55:12

相關問題