2010-05-08 18 views
15

Tengo un problema cuando uso la funcionalidad Asp.Net Cache. Agrego un objeto a la memoria caché y en otro momento obtengo ese objeto de la memoria caché, modifico una de sus propiedades y luego guardo los cambios en la base de datos.Asp.Net Cache, modifique un objeto de la memoria caché y cambie el valor almacenado en la memoria caché

Pero la próxima vez que obtenga el objeto de la memoria caché, contiene los valores modificados. Entonces, cuando modifico el objeto, modifica la versión que está contenida en el caché, aunque no lo he actualizado específicamente en el Caché. ¿Alguien sabe cómo puedo obtener un objeto del caché que no hace referencia a la versión en caché?

es decir

Paso 1:

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

Paso 2:

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

Paso 3:

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

I se dan cuenta de que con el ejemplo anterior tendría sentido que cualquier cambio en el elemento reflejarse en el caché pero mi situación es un poco más complicada y definitivamente no quiero que esto suceda.

+0

Tal vez 'Item' es una 'struct'? Un ejemplo de código completo sería útil ... –

Respuesta

15

La memoria caché hace exactamente eso, almacena en caché lo que sea que ponga en él.

Si almacena en caché un tipo de referencia, recupera la referencia y la modifica, por supuesto, la próxima vez que recupere el elemento en caché, reflejará las modificaciones.

Si desea tener un elemento en caché inmutable, utilice una estructura.

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

¡Me encantan las respuestas que incluyen aserciones! – Bartosz

Cuestiones relacionadas