我曾经在每个方法中尽可能快地连接/打开/关闭数据库连接。我现在正在使用实体框架,因此我的方法都是这样做的:
using (var context = new FooEntities()) {
// linq to sql query here
}
我被告知使用Entity Framework我实际上可以让context
变量成为类级变量而不必在每个方法中实例化它。是真的如此,还是应该在每种方法中继续使用这种模式?
我使用的是5.0.0版本的框架,如果它有所作为的话。
答案 0 :(得分:0)
这取决于您期望它如何发挥作用。您希望它坚持下去的唯一原因是,如果您想跨多个方法调用使用DbContext的缓存功能。但是由于无论如何从池中拉出连接,因此在创建新的DbContext时,处置DbContext不会真正影响性能。
对于我个人而言,我创建尽可能近的上下文并尽快将其杀死。因此,如果您不关心以后再进行更新,则Get调用应使用AsNoTracking()大大加快调用速度。您还可以创建一个DbContextFactory,以便每个类都可以根据需要控制该交互。 (即方法A始终创建一个新方法,但是方法B和C可以共享(如果其中一个首先调用)。虽然,这可能会在将来引起自身的问题,但是您可以选择加入这些条件。
答案 1 :(得分:-1)
您可以将Context作为类的属性,但您必须考虑如何控制Context的处理。例如:
public class UnitOfWork:IDisposable
{
public DbContext Context { get; set; }
public UnitOfWork()
{
Context = null; //initialize context here
}
public void DoWorkWithContext1()
{
//anything you need
}
public void DoWorkWithContext2()
{
//anything you need
}
public void Dispose()
{
if (Context != null)
Context.Dispose();
}
}
然后您将以这种方式使用该课程:
using (var unit= new UnitOfWork())
{
unit.DoWorkWithContext1();
unit.DoWorkWithContext2();
}