我可以将Entity Framework上下文保留为类变量吗?

时间:2018-05-16 17:15:52

标签: entity-framework entity-framework-5

我曾经在每个方法中尽可能快地连接/打开/关闭数据库连接。我现在正在使用实体框架,因此我的方法都是这样做的:

using (var context = new FooEntities()) {
    // linq to sql query here
}

我被告知使用Entity Framework我实际上可以让context变量成为类级变量而不必在每个方法中实例化它。是真的如此,还是应该在每种方法中继续使用这种模式?

我使用的是5.0.0版本的框架,如果它有所作为的话。

2 个答案:

答案 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();
        }