1

我正在编写一个涉及存储配置文件的应用程序。我正在使用 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 来说仍然很新,拥有一个具有众多方法的类的最佳方法是使用相同的数据库访问权限?有这样的全球背景吗?还是每种方法都使用自己的数据上下文?

4

4 回答 4

0

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

于 2013-01-28T15:10:15.467 回答
0

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

于 2013-01-28T15:11:54.740 回答
0

它最终成为我使用的 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;   
   }
}
于 2013-01-29T18:13:14.553 回答
0

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

<meta http-equiv="Pragma" CONTENT="no-cache">
于 2013-01-28T15:27:17.010 回答