EF:如何将上下文对象括在using语句中?

时间:2013-05-06 15:34:06

标签: entity-framework dbcontext

假设我有以下类 Customer.cs ,上下文 OfficeContext.cs ,以及存储库 OfficeRepository.cs 。知道上下文使用连接对象,因此建议将其括在使用语句中:

public List<Customer> GetAllCustomersWithOrders()
{
   using(var oContext = new OfficeContext())
   {
      //Code here....
   }
}

我的问题是,如果我想重新使用存储库中已有的一些代码,该怎么办?例如,如果我想显示订购产品但尚未收到产品的所有客户,我是否需要复制代码呢?

public List<Customer> GetCustomersNotReceiveProducts()
{
  using(var oContext = new OfficeContext())
   {
      //Re-use GetAllCustomersWithOrders() here???...
   }
}

但是正如你所看到的,每次访问一个方法时,我也会打开实例化一个新的上下文对象。有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:1)

我所做的是让我的存储库实现IDisposable。

然后有两个构造函数(一个默认值),用于实现一个新的上下文,将其保存为类级变量。另一个构造函数接受上下文并在内部使用它。

在处理类的情况下处理上下文(如果当前存储库已将其置位)。

这将删除方法级别的上下文并将其移至类级别。我的函数将所有内容保存在IQueryable中,因此一个函数可以在数据库命中之前调用另一个函数并执行其他细化。

〔实施例:

public class MemberRepository : IDisposable
{
  OfficeContext db;
  bool isExternalDb = false;

  public MemberRepository()
  {
    db = new OfficeContext();
    isExternalDb = false;
  }

  public MemberRepository(OfficeContext db)
  {
    this.db = db;
    isExternalDb = true;
  }

  public IQueryable<Member> GetAllMembers()
      {
        var members= db.Members

        return members;
      }

  public IQueryable<Member> GetActiveMembers()
  {
    var members = GetAllMembers();
    var activeMembers = members.Where(m => m.isActive == true);
    return activeMembers;
  }

  public void Dispose()
  {
    if (isExternalDb == false)
    {
      db.Dispose();
    }
  }
}

然后在我使用存储库的地方,我在该级别进行了使用:

using(var memberRepository = new MemberRepository())
{
   var members = memberRepository.GetActiveMembers();
}