2010-05-08 4 views
15

Ich habe ein Problem bei der Verwendung der Asp.Net Cache-Funktionalität. Ich füge ein Objekt zum Cache hinzu, dann zu einem anderen Zeitpunkt hole ich dieses Objekt aus dem Cache, modifiziere eine seiner Eigenschaften und speichere die Änderungen in der Datenbank.Asp.Net Cache, ändern Sie ein Objekt aus dem Cache und es ändert den zwischengespeicherten Wert

Aber das nächste Mal, wenn ich das Objekt aus dem Cache bekomme, enthält es die geänderten Werte. Also, wenn ich das Objekt verändere, ändert es die Version, die im Cache enthalten ist, obwohl ich es nicht speziell im Cache aktualisiert habe. Weiß jemand, wie ich ein Objekt vom Cache bekommen kann, das nicht auf die zwischengespeicherte Version verweist?

dh

Schritt 1:

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

Schritt 2:

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

Schritt 3:

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

Mir ist klar, dass mit dem obigen Beispiel würde es Sinn machen dass irgendwelche Änderungen an dem Gegenstand sich im Cache spiegeln, aber meine Situation ist ein bisschen komplizierter und ich will definitiv nicht, dass das passiert.

+0

Vielleicht 'Item' ist ein' struct'? Ein vollständiges Codebeispiel wäre hilfreich ... –

Antwort

15

Der Cache tut genau das, es speichert alles, was Sie hineinlegen.

Wenn Sie einen Referenztyp zwischenspeichern, rufen Sie den Verweis ab und ändern Sie ihn. Natürlich werden beim nächsten Aufrufen des zwischengespeicherten Elements die Änderungen angezeigt.

Wenn Sie ein unveränderbares zwischengespeichertes Element haben möchten, verwenden Sie eine Struktur.

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

Ich liebe Antworten, die Behauptungen enthalten! – Bartosz

Verwandte Themen