我有一个使用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中替换我的调用,以保持相同的数据上下文。
我似乎在我的代码中看到了很多类型的东西,我担心创建和释放所有这些数据上下文的成本。有没有人对是否值得投入额外的工作以消除这些背景的创建和删除有意见?
答案 0 :(得分:6)
Microsoft提供以下建议/建议,以避免重用DataContext实例http://msdn.microsoft.com/en-us/library/bb386929.aspx
连接池
Q值。有没有可以提供帮助的结构 使用DataContext池?
一个。 不要尝试重用实例 DataContext。每个DataContext 维持状态(包括身份 缓存)用于一个特定的编辑/查询 会话。获取新实例 在数据库的当前状态, 使用新的DataContext。
您仍然可以使用基础ADO.NET 连接池。更多 信息,请参阅SQL Server连接 池化(ADO.NET)。
答案 1 :(得分:5)
可以重用同一逻辑操作的不同部分(可能通过将数据上下文作为参数传递),但是你不应该重复使用它:
等。所以:原子操作很好;一个长寿的应用程序环境;坏。
答案 2 :(得分: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上,您可以将此类作为成员。只是不要从中创建一个全局变量,在完成后进行实例化和处理。