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
。问题仍在发生。
另一个有趣的观察结果是:只有当我导航到另一个页面并返回时,问题才会发生。如果我只是刷新页面,它就不会发生(尽管刷新时仍然保留以前添加的任何数字)
不要返回IQueryable,而是尝试简单地使用IEnumerable并同时使用
使用(DBContext db=新DBContext()){var组=(来自db.Groups中的g其中g.user_id==user_id选择g).ToList();。。。}
也处理你的上下文在上面的声明(使用条款)
ToList()强制执行"现在"-我认为您可能存在延迟执行问题