代码之家  ›  专栏  ›  技术社区  ›  Brian Sullivan

在MVC应用程序中,我应该在哪里创建实体框架上下文对象?

  •  4
  • Brian Sullivan  · 技术社区  · 14 年前

    我的第一个想法是将创建上下文的代码放在Global.asax中的BeginRequest事件处理程序中,但我发现此事件不仅对实际执行工作的初始请求触发,而且对随后对CSS和图像等静态文件的请求也触发。

    4 回复  |  直到 14 年前
        1
  •  4
  •   Craig Stuntz    14 年前
    1. 对任何需要上下文的对象使用构造函数注入。
    2. 将上下文范围设置为请求范围。
        2
  •  2
  •   OdeToCode    14 年前

    如果使用集成管道(默认)在IIS 7中运行,则ASP.NET模块将看到每个请求,甚至是静态内容的请求(请参见 http://learn.iis.net/page.aspx/508/wildcard-script-mapping-and-iis-7-integrated-pipeline/ ),

    如果使用操作筛选器,则如果在OnActionExecuted期间释放上下文,则需要提前完成所有工作。如果要将查询执行延迟到视图呈现,或使用实体的延迟/延迟加载,请在OnResultExecuted期间等待并释放。

    正如Craig指出的,IoC容器也可以为您管理生命周期。

        3
  •  1
  •   Nevada Williford    14 年前

    如果这是一个非常简单的应用程序,而您没有执行DI,那么您可以在控制器的构造函数中实例化EF ObjectContext。查看ASP.NET MVC示例应用程序 http://www.asp.net/mvc 关于入门的基本信息。我认为他们现在使用的三个示例应用程序都使用了EF。

        4
  •  1
  •   John Farrell    14 年前

    另一种流行的方法是重写基本控制器内的OnActionExecuted和OnActionExecuting方法。

        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            _context = new SomeEntities();
            base.OnActionExecuting(filterContext);
        }
    
        protected override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            _context.Dispose();
            base.OnActionExecuted(filterContext);
        }