首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET MVC中的每个请求一个DbContext (没有IOC容器)

ASP.NET MVC中的每个请求一个DbContext (没有IOC容器)
EN

Stack Overflow用户
提问于 2011-06-14 02:29:37
回答 6查看 25.4K关注 0票数 50

如果这个问题已经回答了,很抱歉,但是如果您不使用IOC容器,如何保证每个请求都有一个实体框架DbContext?(到目前为止,我遇到的答案都与IOC容器解决方案有关。)

似乎大多数解决方案都与HttpContext.Current.Items字典挂钩,但是如何保证在请求完成时处理DbContext呢?(或者,对于EF DbContext,处置不是绝对必要的?)

编辑

我目前正在控制器中实例化和部署我的DbContext,但我在ActionFilters和MembershipProvider中也有几个独立的DbContext实例化(我刚刚注意到,还有几个验证器)。因此,我认为将DbContext的实例化和存储集中起来以减少开销可能是一个好主意。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-06-14 02:55:27

我会使用BeginRequest/EndRequest方法,这有助于确保当请求结束时,您的上下文被正确处理。

代码语言:javascript
复制
protected virtual void Application_BeginRequest()
{
    HttpContext.Current.Items["_EntityContext"] = new EntityContext();
}

protected virtual void Application_EndRequest()
{
    var entityContext = HttpContext.Current.Items["_EntityContext"] as EntityContext;
    if (entityContext != null)
        entityContext.Dispose();
}

在你的EntityContext类中..。

代码语言:javascript
复制
public class EntityContext
{
    public static EntityContext Current
    {
        get { return HttpContext.Current.Items["_EntityContext"] as EntityContext; }
    }
}
票数 60
EN

Stack Overflow用户

发布于 2012-04-14 19:54:36

我知道这不是一个最近的问题,但无论如何我都会发布我的答案,因为我相信有人会发现它很有用。

可能和其他许多人一样,我遵循了公认答案中提到的步骤。耶,它起作用了。然而,,有一个问题:

方法BeginRequest()和EndRequest() 在每次发出请求时都会触发,但不仅是针对aspx页面,而且是针对所有静态内容!也就是说,如果您使用上面提到的代码,并且页面上有30个图像,那么您将重新实例化dbcontext 30次!

这个问题的解决方案是使用包装类来检索上下文,如下所示:

代码语言:javascript
复制
internal static class ContextPerRequest
{
      internal static DB1Entities Current
      {
          get
          {
              if (!HttpContext.Current.Items.Contains("myContext"))
              {
                  HttpContext.Current.Items.Add("myContext", new DB1Entities());
              }
              return HttpContext.Current.Items["myContext"] as DB1Entities;
          }
      }
 }

然后用来处理

代码语言:javascript
复制
protected void Application_EndRequest(object sender, EventArgs e)
{
   var entityContext = HttpContext.Current.Items["myContext"] as DB1Entities;
   if (entityContext != null) 
      entityContext.Dispose();
}

此修改可确保每个请求仅实例化和处置一次上下文,且仅在需要时执行。每次选择的答案都会实例化上下文。

注意: DB1Entities是从DbContext派生的(由VS生成)。您可能希望使用您的上下文名称来更改它;)

dbcontext注2:在本例中,我只使用了一个。如果您需要使用多个,则需要根据需要修改此代码。不要认为这是世界问题的终极解决方案,因为它肯定不是最终产品。这只是为了给出一个提示,如何以一种非常简单的方式实现它。

注意3:相同的方法也可以在不同的情况下使用,例如,当您想要共享SqlConnection的实例或任何其他...这个解决方案不是DbContext对象所独有的,也不是实体框架所独有的。

票数 72
EN

Stack Overflow用户

发布于 2011-06-14 02:40:15

一种方法是订阅Application_BeginRequest事件,将DbContext注入到当前HttpContext和从HttpContext获取的Application_EndRequest中,然后进行处置。介于两者之间的任何东西(几乎都是:-)都可以从当前HttpContext中获取DbContext并使用它。是的,你应该把它处理掉。顺便说一下,除了其他有用的东西之外,你有什么理由不使用已经为你做了这件事的依赖注入框架吗?

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6334592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档