Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 返回IQueryable时何时/如何处理DbContext?_Asp.net Mvc_Entity Framework_Iqueryable - Fatal编程技术网

Asp.net mvc 返回IQueryable时何时/如何处理DbContext?

Asp.net mvc 返回IQueryable时何时/如何处理DbContext?,asp.net-mvc,entity-framework,iqueryable,Asp.net Mvc,Entity Framework,Iqueryable,我最近开始使用IQueryable,灵感来自。因此,我已经习惯于在回购协议中这样做: public IEnumerable<POCO> GetById(int id) { using (var ctx = new DbContext()) { var query = from ...; return query.ToList(); } } 甚至注射 public class Repo { private DbContext _ctx;

我最近开始使用IQueryable,灵感来自。因此,我已经习惯于在回购协议中这样做:

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

public class Repo
{
   private DbContext _ctx;

   public Repo(DbContext ctx)
   {
      _ctx = ctx;
   }
}
有哪些优点和缺点:

  • 每个方法中都有一个
    新的DbContext
  • 每个对象(类成员)的
    新DbContext
  • 注入
    DbContext
  • 我正在使用Ninject,因此可以使用
    .InRequestScope()(如果这会影响答案)

    还有几个问题:

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

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

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


    另一方面,如果您的应用程序没有大量的查询,那么在DbContext周围使用
    块将被认为是理想的(因为这可以为您处理dispose),但同样,运行时和内存使用结果可以忽略不计。

    ,使用RequestScope中的
    。提供依赖项注入的所有好处。Ninject还将在循环结束时处理DBContext,因为DBContext实现了IDisposable。看到这个了吗

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

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