2010-05-08 3 views
15

Występuje problem podczas korzystania z funkcji pamięci podręcznej Asp.Net. Dodaję obiekt do pamięci podręcznej, w innym momencie otrzymuję obiekt z pamięci podręcznej, modyfikuję jedną z jego właściwości, a następnie zapisuję zmiany w bazie danych.Asp.Net Cache, modyfikuj obiekt z pamięci podręcznej i zmienia on buforowaną wartość

Ale następnym razem, gdy otrzymam obiekt z pamięci podręcznej, zawiera zmienione wartości. Tak więc, kiedy modyfikuję obiekt, modyfikuje on wersję zawartą w pamięci podręcznej, mimo że nie aktualizowałem jej specjalnie w pamięci podręcznej. Czy ktoś wie, jak mogę uzyskać obiekt z pamięci podręcznej, który nie odwołuje się do wersji z pamięci podręcznej?

tj

Krok 1:

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

Krok 2:

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

Krok 3:

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

Zdaję sobie sprawę, że z powyższego przykładu byłoby sensu wszelkie zmiany w przedmiocie uzyskać odbicie w pamięci podręcznej, ale moja sytuacja jest nieco bardziej skomplikowana i zdecydowanie nie chcę, aby tak się stało.

+0

Może "Przedmiot" to "struktura"? Pełny przykład kodu byłby pomocny ... –

Odpowiedz

15

Pamięć podręczna właśnie to robi, buforuje wszystko, co do niej włożysz.

Jeśli buforujesz typ referencyjny, pobierasz odwołanie i modyfikujesz go, oczywiście przy następnym pobraniu buforowanego elementu będzie on odzwierciedlał modyfikacje.

Jeśli chcesz mieć niezmienny buforowany element, użyj struct.

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

Uwielbiam odpowiedzi, które zawierają twierdzenia! – Bartosz

Powiązane problemy