Asp.net mvc 返回IQueryable时何时/如何处理DbContext?
我最近开始使用IQueryable,灵感来自。因此,我已经习惯于在回购协议中这样做: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;
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
.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;
}
}