关于在Linq中重用数据库上下文的意见

问题描述 投票:7回答:3

我有一个使用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();
    }

...

在对addUser的调用中,我需要返回新列表。 (就目前情况而言,这不是一个很好的设计,但为简单起见,我已省去了细节。)但是,对getList的调用会创建第二个数据上下文。

我可以使用其他方法来解决这个问题,即:

public getList()
{
     using(var db = new MyContext())
        return getList(db);
}
public getList(MyContext db)
{
      ...
}

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

我似乎在我的代码中经常看到这种类型的东西,并且我担心创建和释放所有这些数据上下文的成本。是否有人值得考虑进行额外的工作以消除这些上下文的创建和删除?

c# linq datacontext
3个回答
7
投票

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

常见问题(LINQ to SQL)

连接池

Q。有没有可以帮助的结构使用DataContext池?

A。 请勿尝试重用DataContext。每个DataContext维持状态(包括身份)缓存)用于一个特定的编辑/查询会议。基于获取新实例根据数据库的当前状态,使用新的DataContext。

您仍然可以使用基础ADO.NET连接池。欲了解更多信息,请参阅SQL Server连接合并(ADO.NET)。


5
投票

可以在同一逻辑操作的不同部分重用(也许通过将数据上下文作为参数传入,但是您不应该在此基础上重用其他东西:

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

等等所以:原子操作很好;应用程序寿命长;不好。


1
投票

我通常要做的是创建一个类,您可以使用所有数据函数作为成员来调用诸如DataManager之类的东西。此类在其构造函数上创建MyContext的实例。

class DataManager
{
   private MyContext db;

   public DataManager() {
       db = new MyContext();
   }

   public User[] getList()
   {
       return db.Users.Where(item => item.Active == false);
   }

   public User[] addUser(string name)
   {
       db.Users.InsertOnSubmit(new User() { id = Guid.NewId(),  name = name, active = false ...});
       return getList();
   }
}

只要执行一组操作,就创建此类的实例。例如,在Controller上,您可以将此类作为成员。只是不要用它做一个全局变量,完成后实例化并处置它。

© www.soinside.com 2019 - 2024. All rights reserved.