ASP.NET MVC 3/Razor-奇怪的缓存问题

本文关键字:缓存 问题 Razor- NET MVC ASP | 更新日期: 2023-09-27 18:25:07

我使用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>;
    }
}

更新:

我现在已经实现了Adam Tuliper和Paul Tyng的建议,即用using子句调用数据上下文,用ToList()结束linq语句,并使用ICollection而不是IQueryable。问题仍在发生。

另一个有趣的观察结果是:只有当我导航到另一个页面并返回时,问题才会发生。如果我只是刷新页面,它就不会发生(尽管刷新时仍然保留以前添加的任何数字)

ASP.NET MVC 3/Razor-奇怪的缓存问题

不要返回IQueryable,而是尝试简单地使用IEnumerable并同时使用

使用(DBContext db=新DBContext()){var组=(来自db.Groups中的g其中g.user_id==user_id选择g).ToList();。。。}

也处理你的上下文在上面的声明(使用条款)

ToList()强制执行"现在"-我认为您可能存在延迟执行问题