我已经实现了一个基本控制器,每个请求实例化一个新的DbContext
:
public class BaseController: Controller
{
protected HawkHeadDbContext Db { get; set; }
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
Db = new HawkHeadDbContext();
}
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
Db.SaveChanges();
Db.Dispose();
}
}
我有点担心Dispose
调用会变成CPU密集型,也许我应该在Dispose
BaseController
方法中处理上下文。我怀疑控制器是针对每个请求实例化的,但是不确定在每个请求之后是否调用Dispose
,或者在常规的DisposeAllControllers'类型操作。
答案 0 :(得分:4)
上下文的设计时间短。通常你会在
中看到它using(var ctx = new DbContext())
{
...
}
这意味着在使用结束后立即调用ctx.Dispose。
更多详情here,请参阅"生命周期"部分。
所以关于你的代码,如果你没有使用依赖注入(在这种情况下你可以根据请求配置dbcontext),你在执行动作后就可以很好地处理它了。
唯一的问题是如果你调用子操作会怎样。在这种情况下,每个请求可能会有一个以上的dbcontext