2010-05-08 116 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