关于在Linq中重用db上下文的意见

Jes*_*caB 6 c# linq datacontext

我有一个使用linq访问数据库的类.一些方法称其他方法.例如:

class UserManager
{
   public User[] getList()
   {
       using(var db = new MyContext())
       {
             return db.Users.Where(item => item.Active == false);
       }
    }
    public User[] addUser(string name)
    {
       using(var db = new MyContext())
       {
           db.Users.InsertOnSubmit(new User() { id = Guid.NewId(),  name = name, active = false ...});
       }
       return getList();
    }
Run Code Online (Sandbox Code Playgroud)

...

在对addUser的调用中,我需要返回新列表.(我知道它不是很好的设计,但为了简单起见,我已经删除了细节.)但是,对getList的调用会创建第二个数据上下文.

我可以用额外的方法填写这个,即:

public getList()
{
     using(var db = new MyContext())
        return getList(db);
}
public getList(MyContext db)
{
      ...
}
Run Code Online (Sandbox Code Playgroud)

然后在addUser中替换我的调用,以保持相同的数据上下文.

我似乎在我的代码中看到了很多类型的东西,我担心创建和释放所有这些数据上下文的成本.有没有人对是否值得投入额外的工作以消除这些背景的创建和删除有意见?

Joh*_*n K 6

Microsoft提供以下建议/建议,以避免重用DataContext实例http://msdn.microsoft.com/en-us/library/bb386929.aspx

常见问题(LINQ to SQL)

连接池

问:是否有一个可以帮助DataContext池的构造?

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

您仍然可以使用基础ADO.NET连接池.有关详细信息,请参阅SQL Server连接池(ADO.NET).


Mar*_*ell 5

可以重用同一逻辑操作的不同部分(可能通过将数据上下文作为参数传递),但是你不应该重复使用它:

  • 它缓存对象; 这会很快变大
  • 你不应该在线程之间共享
  • 一旦你遇到异常,重用就变得非常不明智了

等等:原子操作很好; 一个长寿的应用程序环境; 坏.