Web应用程序中的LinqToSql静态DataContext

SBu*_*ris 8 c# asp.net datacontext linq-to-sql

在我遇到的Web应用程序中,我发现以下代码在处理LinqToSQL时处理DataContext

public partial class DbDataContext
  {
    public static DbDataContext DB
    {
      get
      {
        if (HttpContext.Current.Items["DB"] == null)
          HttpContext.Current.Items["DB"] = new DbDataContext();
        return (DbDataContext)HttpContext.Current.Items["DB"];
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

然后在以后执行此操作:

DbDataContext.DB.Accounts.Single(a => a.accountId == accountId).guid = newGuid;
DbDataContext.DB.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)

在处理LinqToSQL时,我一直在研究最佳实践.

我不确定在处理DataContext不是ThreadSafe并保留它的静态副本时这个方法.

这是一个很好的方法来接受Web应用程序吗?

@ Longhorn213 - 根据你所说的内容,我读到的HttpContext就越多,我认为你是对的.但是在我继承的应用程序中,这让人感到困惑,因为在每个方法的开头,他们都在重新查询db以获取信息,然后修改datacontext的实例并在其上提交更改.

从这一点来看,我认为应该不鼓励使用这种方法,因为它给出的错误印象是datacontext是静态的并且在请求之间保持不变.如果未来的开发人员认为在方法开始时重新查询数据是因为他们认为数据已经存在,那么他们可能遇到问题而不理解原因.

所以我想我的问题是,如果在未来的发展中不鼓励这种方法吗?

Joh*_*ers 6

这不是静态副本.请注意,该属性从Context.Items中检索它,这是每个请求.这是DataContext的每请求副本,可通过静态属性访问.

另一方面,此属性假设每个请求只有一个线程,这可能永远不会成立.