Asp.Net Cache,从缓存修改对象,并更改缓存值

前端之家收集整理的这篇文章主要介绍了Asp.Net Cache,从缓存修改对象,并更改缓存值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用Asp.Net Cache功能时,我有一个问题.我将一个对象添加到缓存,然后在另一个时间,我从缓存中获取该对象,修改其中一个属性,然后将更改保存到数据库.

但是,下一次从Cache获取对象时,它包含更改的值.所以,当我修改对象时,它会修改缓存中包含的版本,即使我没有在缓存中更新它.有人知道如何从缓存中获取一个不引用缓存版本的对象?

步骤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.");
}

我意识到,使用上面的例子,对项目的任何更改都将反映在缓存中是有意义的,但是我的情况有点复杂,我绝对不希望这样做.

解决方法

缓存只是这样,它缓存了你放入的任何东西.

如果缓存引用类型,检索引用并进行修改,当然下次检索缓存的项时,它将反映修改.

如果你想有一个不可变的缓存项目,使用一个结构体.

Cache.Insert("class",new MyClass() { Title = "original" },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" },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");

猜你在找的asp.Net相关文章