Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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 我应该在MVC应用程序中的何处创建实体框架上下文对象?_Asp.net Mvc_Entity Framework - Fatal编程技术网

Asp.net mvc 我应该在MVC应用程序中的何处创建实体框架上下文对象?

Asp.net mvc 我应该在MVC应用程序中的何处创建实体框架上下文对象?,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我希望使用每请求会话模式,就像在ASP.NET环境中使用NHibernate时经常使用的那样 我的第一个想法是将创建上下文的代码放在Global.asax中的BeginRequest事件处理程序中,但我发现该事件不仅针对实际执行工作的初始请求,而且针对后续静态文件(如CSS和图像)的请求 我不想在不需要的时候创建一大堆额外的上下文,所以有没有一种方法可以让我的代码在初始请求上运行,而不是在静态文件上运行?当我使用依赖项注入框架时,我通常有一个单独的程序集,其中包含域模型。该程序集还包含存储库的接

我希望使用每请求会话模式,就像在ASP.NET环境中使用NHibernate时经常使用的那样

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


我不想在不需要的时候创建一大堆额外的上下文,所以有没有一种方法可以让我的代码在初始请求上运行,而不是在静态文件上运行?

当我使用依赖项注入框架时,我通常有一个单独的程序集,其中包含域模型。该程序集还包含存储库的接口。存储库的实现包含实际实例化EF ObjectContext的代码


但是,如果这是一个非常简单的应用程序,并且您没有进行DI,那么您可以始终在控制器的构造函数中实例化EF ObjectContext。请查看上的ASP.NET MVC示例应用程序,以获取入门的基本信息。我认为他们所有的三个示例应用程序现在都使用EF。

您是否使用带有通配符映射的IIS 6?CSS和图像不应触发BeginRequest

另一种常用的方法是重写基本控制器内的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);
    }
  • 对任何需要上下文的内容使用构造函数注入
  • 使用您选择的DI框架并映射上下文
  • 将上下文范围设置为请求范围

  • 如果您使用集成管道(默认)在IIS 7中运行,ASP.NET模块将看到每个请求,甚至是静态内容请求(请参阅)

    如果您仍然想使用HTTP模块来管理每个请求的会话/内容,我会考虑使用惰性来避免在不需要的情况下实例化上下文。 如果使用操作筛选器,那么如果在OnActionExecuted期间处理上下文,则需要提前完成所有工作。如果要在视图呈现之前延迟查询执行,或使用延迟/延迟加载实体,请在OnResultExecuted期间等待并释放


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

    不,我用的是IIS7。在这种情况下,静态文件是否应该调用BeginRequest?不,它们甚至不应该触及管道。