【问题标题】:Weird caching issue with ASP.net/LinqASP.net/Linq 的奇怪缓存问题
【发布时间】:2013-01-11 23:02:57
【问题描述】:

我正在编写一个涉及存储配置文件的应用程序。我正在使用 Linq 访问数据库,但在保存配置文件时遇到了一个奇怪的问题。当我保存它时,它会正确写入数据库 - 但是当我离开页面并返回时,旧值仍保留在配置文件形式中。

我的个人资料页面:

if(!Page.IsPostBack) {
    Profile p = Student.GetProfile(Int32.Parse(Session["userID"].ToString()));
    if (p != null)
    {
          FirstNameTextBox.Text = p.FirstName;
          LastNameTextBox.Text = p.LastName;
          Address1TextBox.Text = p.Address1;
          .....
    }

还有我的学生班:

    public static Profile GetProfile(int uID)
    {
        var profile = (from p in db.Profiles
                       where p.uID == uID
                       select p).FirstOrDefault();
        return profile;
    }

我没有在任何地方做任何花哨的缓存,所以不确定旧值的存储位置...

** 编辑 **

所以,它似乎归结为全局 LinqDataContext。在我的学生课上,我有:

public class Student
{
    private static LinqClassesDataContext db = new LinqClassesDataContext() { CommandTimeout = 36000 };

    public static Profile GetProfile(int uID)
    {
            var profile = (from p in db.Profiles
                           where p.uID == uID
                           select p).FirstOrDefault();
            return profile;   
    }

如果我给 GetProfile 方法它自己的 DataContext,问题就解决了。

对于 Linq 来说还是个新手,让一个具有许多方法的类使用相同的数据库访问权限的最佳方法是什么?有这样的全球背景吗?还是每个方法都使用自己的数据上下文?

【问题讨论】:

  • 为了清楚起见,您是说查询时新值出现在您的数据库中,但是一旦您离开,然后返回,旧值又回到数据库中?
  • 正确的值会在数据库中更新 - 并留在那里。但是当我离开页面并返回时,就好像它不再查询数据库一样。

标签: asp.net linq webforms


【解决方案1】:

假设您将userID 存储在Session["userID"] 的某个地方并且在保存时没有将其清除,这可能是“缓存”发生的地方。 Session 对象将(大致)在浏览器会话的生命周期内(或者如果启用内存会话,则在服务器进程的生命周期内)存在。

【讨论】:

  • 保存配置文件时用户ID不会改变,所以我不确定这会如何导致问题。
  • 我不是说它改变了,我说的是它仍在会话中,所以当您重新加载页面时,它仍然会从会话中加载 ID。由于您没有显示设置(或清除)该会话变量的位置,我假设您没有清除(或更改)它。
  • 进一步的测试表明,当我注销(并且会话被破坏)并重新登录时,旧的/缓存的值仍然填充到表单中。
【解决方案2】:

我猜即使 linq 将查询发送到数据库,它也会使用存储在缓存中的旧值。所以如果你想要新值,你必须清除缓存。

【讨论】:

  • 我想我不确定为什么要开始缓存。当页面加载时,它应该在数据库中查找当前值......它不是。
【解决方案3】:

继续您添加的 cmets,我的猜测是您获取的页面已被浏览器/http 服务器缓存。如果 url 与先前请求的页面相同,则某些默认设置将告诉浏览器/服务器使用缓存 html。为了避免这种情况并为每个请求获取新的 html,您可以尝试在 html 的 head 标记中添加元标记。

<meta http-equiv="Pragma" CONTENT="no-cache">

【讨论】:

  • 我认为这可能与浏览器有关,但即使在进行了硬刷新之后,它仍然在提取旧数据。已经添加了这个,但没有解决问题。
  • 每当我重建网站时,它都会加载正确的信息。
  • 我正在运行 Chrome,我已在浏览器中关闭缓存以进行测试。
【解决方案4】:

它最终成为我使用的 DataContext。我不完全确定为什么这解决了这个问题,但我改变了我的课程:

public class Student
{
   private static LinqClassesDataContext db = new LinqClassesDataContext() { CommandTimeout = 36000 };

   public static Profile GetProfile(int uID)
   {
        var profile = (from p in db.Profiles
                       where p.uID == uID
                       select p).FirstOrDefault();
        return profile;   
   }
}

到:

public class Student
{
   public static Profile GetProfile(int uID)
   {     
        LinqClassesDataContext db = new LinqClassesDataContext();
        var profile = (from p in db.Profiles
                       where p.uID == uID
                       select p).FirstOrDefault();
        return profile;   
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2019-01-07
    • 1970-01-01
    相关资源
    最近更新 更多