2010-05-08 121 views
15

我在使用Asp.Net緩存功能時遇到問題。我向緩存中添加一個對象,然後在另一次從緩存中獲取該對象時,修改其中一個屬性,然後將更改保存到數據庫中。Asp.Net緩存,修改緩存中的對象,並更改緩存的值

但是,下一次從緩存中獲取對象時,它將包含更改的值。所以,當我修改對象時,它會修改緩存中包含的版本,即使我沒有專門在緩存中更新它。有誰知道我如何從緩存中獲取不引用緩存版本的對象?

步驟1:

Item item = new Item(); 
item.Title = "Test"; 
Cache.Insert("Test", item, null, DateTime.Now.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration); 

步驟2:

Item item = (Item)Cache.Get("test"); 
item.Title = "Test 1"; 

步驟3:

Item item = (Item)Cache.Get("test"); 
if(item.Title == "Test 1"){ 
    Response.Write("Object has been changed in the Cache."); 
} 

我知道上述示例它將使感該項目的任何更改得到反映在緩存中,但我的情況有點複雜,我絕對不希望發生這種情況。

+0

也許'Item'是一個'struct'?一個完整的代碼示例將有所幫助... – 2010-05-08 06:23:05

回答

15

緩存就是這樣做的,緩存你放入它的任何東西。

如果您緩存引用類型,請檢索引用並對其進行修改,當然下次您檢索緩存項時它將反映修改。

如果你想有一個不可變的緩存項目,使用一個結構。

Cache.Insert("class", new MyClass() { Title = "original" }, null, 
    DateTime.Now.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration); 
MyClass cachedClass = (MyClass)Cache.Get("class"); 
cachedClass.Title = "new"; 

MyClass cachedClass2 = (MyClass)Cache.Get("class"); 
Debug.Assert(cachedClass2.Title == "new"); 

Cache.Insert("struct", new MyStruct { Title = "original" }, null, 
    DateTime.Now.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration); 

MyStruct cachedStruct = (MyStruct)Cache.Get("struct"); 
cachedStruct.Title = "new"; 

MyStruct cachedStruct2 = (MyStruct)Cache.Get("struct"); 
Debug.Assert(cachedStruct2.Title != "new"); 
+0

我喜歡包含斷言的回覆! – Bartosz 2017-07-03 10:46:41