Asp.net mvc 我应该在MVC应用程序中的何处创建实体框架上下文对象?
我希望使用每请求会话模式,就像在ASP.NET环境中使用NHibernate时经常使用的那样 我的第一个想法是将创建上下文的代码放在Global.asax中的BeginRequest事件处理程序中,但我发现该事件不仅针对实际执行工作的初始请求,而且针对后续静态文件(如CSS和图像)的请求Asp.net mvc 我应该在MVC应用程序中的何处创建实体框架上下文对象?,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我希望使用每请求会话模式,就像在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);
}
如果您使用集成管道(默认)在IIS 7中运行,ASP.NET模块将看到每个请求,甚至是静态内容请求(请参阅)
如果您仍然想使用HTTP模块来管理每个请求的会话/内容,我会考虑使用惰性来避免在不需要的情况下实例化上下文。 如果使用操作筛选器,那么如果在OnActionExecuted期间处理上下文,则需要提前完成所有工作。如果要在视图呈现之前延迟查询执行,或使用延迟/延迟加载实体,请在OnResultExecuted期间等待并释放
正如克雷格指出的,IoC容器也可以为您管理生命周期 不,我用的是IIS7。在这种情况下,静态文件是否应该调用BeginRequest?不,它们甚至不应该触及管道。