2 votes

ASP.NET MVC 3 / Razor - Étrange problème de mise en cache

J'utilise une requête LinqToSql pour sélectionner une liste de groupes dans une base de données et produire un tableau. J'ai écrit une classe personnalisée pour mettre en cache les résultats de cette requête afin d'améliorer les performances. Le problème est qu'à chaque fois que j'implémente la classe de mise en cache, j'obtiens un comportement d'ajout bizarre de la part de l'instruction de sortie.

Mes résultats sont affichés dans le format

Test Group (1)

où "Test Group" est le nom, et (1) est le nombre de membres dans ce groupe. Voici le code qui ajoute le nombre au nom (à partir de la vue)

<td>@group.group_name (@group.num_total)</td>

Lorsque je tire cela d'une requête linq en direct qui renvoie des groupes, tout fonctionne comme prévu.

Cependant Lorsque j'utilise ma classe de mise en cache, chaque chargement de page successif ajoute le numéro à la fin du titre du groupe :

Test Group (1) (1) (1) (1) (1) (1)

Cela ne se produit que lorsque j'utilise la classe de cache (incluse ci-dessous). J'ai examiné la classe de cache et je ne vois pas pourquoi cela se produirait.

Je peux penser à plusieurs solutions de contournement pour ce problème, donc ce n'est pas un obstacle, mais je suis curieux de savoir ce qui se passe. Une idée ?

Classe de mise en cache :

public class Cache
{
    public static int user_id { 
        get { return 
            Convert.ToInt32(
                Membership.GetUser(
                    HttpContext.Current.User.Identity.Name
                ).ProviderUserKey
            ); 
        } 
    }

    public static void GetGroups_InvalidateCache()
    {
        if (HttpContext.Current.Cache["GetGroups_" + user_id] != null)
            HttpContext.Current.Cache.Remove("GetGroups_" + user_id);
    }

    public static ICollection<Groups> GetGroups()
    {
        if (HttpContext.Current.Cache["GetGroups_" + user_id] == null)
        {
            using(DBContext db = new DBContext())
            {

                var Groups = (from g in db.Groups 
                        where g.user_id == user_id 
                        select g).ToList(); 

                HttpContext.Current.Cache.Insert(
                        "GetGroups_" + user_id, 
                        Groups, 
                        null, 
                        DateTime.Now.AddMinutes(5), 
                        TimeSpan.Zero
                );
            }
        }
        return HttpContext.Current.Cache["GetGroups_" + user_id] 
                    as ICollection<Groups>;
    }
}

UPDATE :

J'ai maintenant implémenté les suggestions d'Adam Tuliper et de Paul Tyng d'appeler le contexte de données avec la fonction using en terminant l'instruction linq par ToList() et en utilisant ICollection au lieu de IQueryable . Le problème se pose toujours.

Une autre observation intéressante : Le problème ne se produit que si je navigue vers une autre page et que je reviens. Si je rafraîchis simplement la page, cela ne se produit pas (bien que les ajouts de chiffres précédents soient toujours présents lorsque je rafraîchis la page).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X