1

我有一个 2 层 Web 应用程序。数据访问和网站。

因此,在我dataContext.cs的 DataAccess 层中,我添加了包装器...

  //The autogenreated context when I made the linq2sql class
  public static MyDataContext DataContext
    {
        get
        {
            //We are in a web app, use a request scope
            if (HttpContext.Current != null)
            {
                if (HttpContext.Current.Items["dc"] == null)
                {
                    MyDataContext dc = new MyDataContext ();
                    HttpContext.Current.Items["dc"] = dc;
                    return dc;
                }
                else
                    return (MyDataContext )HttpContext.Current.Items["dc"];
            }
            else
            {
                if (dataContext == null)
                    dataContext = new MyDataContext ();



                return dataContext;
            }
        }
    }

    //the method I added to the autogenreated contex in 
    //an attempt to wrap the profiler around it
    public static MyDataContext Get()
    {
        var sqlConnection = new MyDataContext().Connection;
        var profiledConnection = new StackExchange.Profiling.Data.ProfiledDbConnection(sqlConnection, MiniProfiler.Current);

        return new MyDataContext(profiledConnection);
    }

所以这就是 profileConnection 在被调用时但在调用之前的样子return New MyDataContext(porofiledConnection)

在此处输入图像描述

并且在我的业务逻辑中也在 DataAccess 层中,我确保数据库上下文都是用db = MyDataContext.Get() 而不是db = new MyDataContext();

public class MyOrders(){
  private static  MyDataContext db = MyDataContext.Get();

  public static List<model> GetOrderHistory(){
      var = db.MyStoredProcedure(args) //Inspecting here before execution
      //proces result and return list of model
      }

 }

现在,在某些页面上,我曾经获取 SQL 行,我可以单击它们并检查它们。但是在我浏览了该站点后,它只显示了这一点-不再有 SQL 行了吗?就像这个页面一样,它只是随机地向我显示 SQL 重复 - 但如果我重新加载它就消失了。

在此处输入图像描述

在此页面上,我之前从未使用探查器运行过加载时间问题,但我无法识别它使用的 SQL。

在此处输入图像描述

我错过了什么?SQL 是否被缓存?即使 Linq2Sql 缓存它或其他什么,我也总是想查看 SQL。我做错什么了?

4

1 回答 1

2

您的MyOrders班级中有一个静态数据上下文。DataContext内部有一个内部缓存来跟踪实体的变化并避免在一个业务事务中往返数据库。将其保持为静态,意味着内部缓存将暂时增加并且不会正确释放。这可能是分析器中查询消失的原因。此外,当多个用户从多个线程访问相同的上下文时,您可能会遇到问题,并且可能会出现内存泄漏。

来自MSDN的注释:

通常,一个DataContext实例被设计为持续一个“工作单元”,但是您的应用程序定义了该术语。DataContext 是轻量级的,创建起来并不昂贵。典型的 LINQ to SQL 应用程序DataContext在方法范围内创建实例,或者作为表示一组相关数据库操作的逻辑集的短期类的成员。

还有一个:

不要尝试重用DataContext. 每个都DataContext 维护一个特定编辑/查询会话的状态(包括身份缓存)。要根据数据库的当前状态获取新实例,请使用新的DataContext.

您可以在 Rick Strahl 的文章Linq to SQL DataContext Lifetime Management中找到更多详细信息。

于 2013-02-07T17:34:27.297 回答