如果每个请求使用一个DbContext实例,我是否应该在每个请求上配置上下文:

时间:2016-01-24 03:54:00

标签: c# asp.net-mvc entity-framework asp.net-mvc-5

我已经实现了一个基本控制器,每个请求实例化一个新的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'类型操作。

1 个答案:

答案 0 :(得分:4)

上下文的设计时间短。通常你会在

中看到它
using(var ctx = new DbContext())
{
    ...
}

这意味着在使用结束后立即调用ctx.Dispose。

更多详情here,请参阅"生命周期"部分。

所以关于你的代码,如果你没有使用依赖注入(在这种情况下你可以根据请求配置dbcontext),你在执行动作后就可以很好地处理它了。

唯一的问题是如果你调用子操作会怎样。在这种情况下,每个请求可能会有一个以上的dbcontext