我有一个使用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中的调用,以保持相同的数据上下文。
我似乎在我的代码中经常看到这种类型的东西,并且我担心创建和释放所有这些数据上下文的成本。是否有人值得考虑进行额外的工作以消除这些上下文的创建和删除?
Microsoft提供以下建议/建议,以不重用DataContext实例http://msdn.microsoft.com/en-us/library/bb386929.aspx
连接池
Q。有没有可以帮助的结构使用DataContext池?
A。 请勿尝试重用DataContext。每个DataContext维持状态(包括身份)缓存)用于一个特定的编辑/查询会议。基于获取新实例根据数据库的当前状态,使用新的DataContext。
您仍然可以使用基础ADO.NET连接池。欲了解更多信息,请参阅SQL Server连接合并(ADO.NET)。
可以在同一逻辑操作的不同部分重用(也许通过将数据上下文作为参数传入,但是您不应该在此基础上重用其他东西:
等等所以:原子操作很好;应用程序寿命长;不好。
我通常要做的是创建一个类,您可以使用所有数据函数作为成员来调用诸如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上,您可以将此类作为成员。只是不要用它做一个全局变量,完成后实例化并处置它。