【问题标题】:When/How to dispose DbContext when returning IQueryable?返回 IQueryable 时何时/如何处理 DbContext?
【发布时间】:2013-08-09 15:28:17
【问题描述】:

我最近开始使用受http://www.codethinked.com/keep-your-iqueryable-in-check 启发的 IQueryable。所以我已经习惯在我的 repos 中这样做了:

public IEnumerable<POCO> GetById(int id)
{
   using (var ctx = new DbContext())
   {
      var query = from ...;
      return query.ToList();
   }
}

现在我正在这样做:

public IPageable<POCO> GetById(int id)
{
   var ctx = new DbContext()
   var query = from ...;
   return new Pageable(query);
}

但我想知道这是否是处理new DbContext() 的最佳方式。 将DbContext 放置为班级成员会更好吗

public class Repo
{
   private DbContext _ctx = new DbContext();
}

甚至注入它

public class Repo
{
   private DbContext _ctx;

   public Repo(DbContext ctx)
   {
      _ctx = ctx;
   }
}

有什么好处和坏处:

  1. 每个方法中都有一个new DbContext
  2. 每个对象(类成员)一个 new DbContext
  3. 注入DbContext

我正在使用 Ninject,所以我可以使用 .InRequestScope();(如果这会影响答案)

还有几个问题:

  • 如果 DbContext 保留为类,我的 repo 是否应该实现 IDisposable 成员?
  • 还有比上述方法更好的处理 DbContext 的方法吗?

【问题讨论】:

    标签: asp.net-mvc entity-framework iqueryable


    【解决方案1】:

    实体框架喜欢缓存。如果您不断更改您的应用程序并在浏览器中重新加载它,您可能会注意到第一次重新加载它需要几秒钟的时间来加载,但在那之后,页面几乎是瞬时的。这是因为 MVC 和 EF 正在缓存重复使用的常见查询,从而使您的应用在初始加载时间之后可以更快地使用。

    因此,在哪里创建 DBContext 并不重要。是的,创造任何东西都需要时间。但是,即使您刚刚创建了上下文的新实例,EF 也会识别这些查询并快速加载它们。

    附带说明,如果您的应用程序没有大量查询,则在 DbContext 周围使用 Using 块将被认为是理想的(因为它会为您处理处置),但同样,运行时并且内存使用结果可以忽略不计。

    【讨论】:

      【解决方案2】:

      我总是会使用InRequestScope 注入 DBContext。提供依赖注入的所有好处。Ninject 还将在循环结束时释放 DBContext,因为 DBContext 实现了 IDisposable。看到这个thread

      如果你使用 DI,你的其他两个问题就变得无关紧要了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-12
        • 1970-01-01
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多