2010-05-08 2 views
15

Je rencontre un problème lors de l'utilisation de la fonctionnalité Asp.Net Cache. J'ajoute un objet au cache puis à un autre moment je reçois cet objet du cache, modifie l'une de ses propriétés puis enregistre les modifications dans la base de données. Mais, la prochaine fois que j'obtiens l'objet de Cache, il contient les valeurs changées. Donc, quand je modifie l'objet, il modifie la version qui est contenue dans le cache même si je ne l'ai pas mis à jour dans le cache spécifiquement. Est-ce que quelqu'un sait comment je peux obtenir un objet du cache qui ne fait pas référence à la version en cache?Asp.Net Cache, modifier un objet à partir du cache et il modifie la valeur mise en cache

-à-dire

Étape 1:

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

Étape 2:

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

Étape 3:

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

Je me rends compte que l'exemple ci-dessus, il serait logique que tous les changements à l'article se reflète dans la mémoire cache, mais ma situation est un peu plus compliquée et je ne veux vraiment pas que cela se produise.

+0

Peut-être 'Item' est un' struct'? Un exemple de code complet serait utile ... –

Répondre

15

Le cache fait exactement cela, il met en cache tout ce que vous y mettez.

Si vous mettez en cache un type de référence, récupérez la référence et modifiez-la, bien sûr la prochaine fois que vous récupérerez l'élément mis en cache, il reflétera les modifications.

Si vous souhaitez avoir un élément en cache immuable, utilisez une structure.

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

J'adore les réponses qui incluent des assertions! – Bartosz