ASP.NET MVC 3 / Razor - Странная проблема с кэшированием - PullRequest
2 голосов
/ 20 февраля 2012

Я использую запрос LinqToSql, чтобы выбрать список групп из базы данных и выпустить таблицу.Я написал собственный класс для кэширования результатов этого запроса для повышения производительности.Проблема в том, что всякий раз, когда я реализую класс кэширования, я получаю странное добавляющее поведение из оператора вывода.

Мои результаты выводятся в формате

Test Group (1)

, где «Группа тестов» - это имя, а (1) - количество членов в этой группе.Вот код, который добавляет количество к имени (из представления)

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

Когда я извлекаю это из живого запроса linq, возвращающего группы, все работает как положено.

Однако , когда я использую свой класс кэширования, каждая последующая загрузка страницы добавляет число в конец заголовка группы:

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

Это происходит только тогда, когдаЯ использую класс кеширования (включен ниже).Я изучил класс кеша и не вижу причин, по которым это происходит.

Я могу придумать несколько обходных путей для этой проблемы, так что это не пробка, но мне любопытно, чток тому, что происходит с выдумкой.Есть идеи?

Класс кэширования:

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>;
    }
}

ОБНОВЛЕНИЕ:

Теперь я реализовал предложения Адама Тулипера и Пола Тинга о вызове контекста данных с помощьюusing, заканчивая оператор linq ToList() и используя ICollection вместо IQueryable.Проблема все еще происходит.

Еще одно интересное наблюдение: проблема возникает, только если я перехожу на другую страницу и возвращаюсь.Если я просто обновлю страницу, этого не произойдет (хотя при обновлении все равно остаются предыдущие добавления номера)

1 Ответ

2 голосов
/ 20 февраля 2012

Вместо того, чтобы возвращать IQueryable, попробуйте использовать просто IEnumerable, а также

using(DBContext db = new DBContext())
{
var Groups = 
                (from g in db.Groups 
                where g.user_id == user_id 
                select g).ToList(); 
...
}

Также избавьтесь от своего контекста, как в приведенном выше утверждении (с предложением using)

ToList () заставляет выполнение "сейчас" - я думаю, что у вас потенциально есть проблемы с отложенным выполнением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...