Entity framework EF:如何在using语句中包含上下文对象?

Entity framework EF:如何在using语句中包含上下文对象?,entity-framework,dbcontext,Entity Framework,Dbcontext,假设我有以下类:Customer.cs、contextOfficeContext.cs和repositoryofficepository.cs。知道上下文使用连接对象,建议使用语句将其括在中: public List<Customer> GetAllCustomersWithOrders() { using(var oContext = new OfficeContext()) { //Code here.... } } 公共列表GetAllCusto

假设我有以下类:Customer.cs、contextOfficeContext.cs和repositoryofficepository.cs。知道上下文使用连接对象,建议使用语句将其括在中:

public List<Customer> GetAllCustomersWithOrders()
{
   using(var oContext = new OfficeContext())
   {
      //Code here....
   }
}
公共列表GetAllCustomerWithOrders() { 使用(var oContext=new OfficeContext()) { //代码在这里。。。。 } } 我的问题是,如果我想重用存储库中已有的一些代码,该怎么办?例如,如果我想显示所有订购了产品但尚未收到的客户,是否需要复制代码

public List<Customer> GetCustomersNotReceiveProducts()
{
  using(var oContext = new OfficeContext())
   {
      //Re-use GetAllCustomersWithOrders() here???...
   }
}
公共列表GetCustomersNotReceiveProducts() { 使用(var oContext=new OfficeContext()) { //在此处重复使用GetAllCustomerWithOrders()???。。。 } }
但正如您所看到的,每次访问一个方法时,我都会打开并实例化一个新的上下文对象。有没有办法解决这个问题?

我要做的是让我的存储库实现IDisposable

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

在dispose类上,上下文被释放(如果当前存储库安装了上下文)

这会将上下文从方法级别移除,并将其移动到类级别。我的函数将所有内容都保存在IQueryable中,以便一个函数可以调用另一个函数,并在它访问数据库之前执行额外的优化

Exmaple:

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