在HTTP中缓存单个EF 6 DBContext是否会引起关注?

时间:2014-05-12 15:15:41

标签: c# entity-framework caching httpcontext

我正在开发一个项目,我们在是否在HTTP请求中缓存EF 6 DBContext时遇到了冲突。

对于每个HTTP请求,我们实例化多个类,我们可以在每个类上调用多个方法。

每个类实例的一个DBContext实例是最佳的,还是可以在HTTPContext.Cache中缓存单个Dbcontext?

其他因素:

  • 我倾向于每个类的一个DBContext,但是其他人关心"新的DBContext"

  • 的成本
  • 我们不使用IoC / DI容器

  • 我们没有进行有意的异步操作。

  • 一些相关的答案来自2010年,我想确保这些答案是相关的

1 个答案:

答案 0 :(得分:3)

不要在请求之间缓存上下文实例。它们设计用于小范围和处理。缓存的上下文将"泄漏" (或者更确切地说,消耗越来越多)内存,因为它会累积来自所有应用程序查询和提交的所有更改跟踪数据。

  

When working with Web applications, use a context instance per request.

同一文件也提到:

  

上下文不是线程安全的。只要多个上下文不同时跟踪同一实体类的实例,您仍然可以创建多线程应用程序。

这完全排除了共享上下文,因为请求由ThreadPool的许多线程提供。

以下是如何在MVC应用中实现每请求共享上下文的方法:

的Global.asax:

public class MvcApplication : System.Web.HttpApplication
{
    public const string dbcontext = "Db.Context";

    public MvcApplication()
    {
        BeginRequest += MvcApplication_BeginRequest;
        EndRequest += MvcApplication_EndRequest;
    }
    void MvcApplication_BeginRequest(object sender, EventArgs e)
    {
        HttpContext.Current.Items[dbcontext] = new BlahContext();
    }
    void MvcApplication_EndRequest(object sender, EventArgs e)
    {
        var ctx = HttpContext.Current.Items[dbcontext] as BlahContext;
        if (ctx != null)
            try
            {
                (ctx as IDisposable).Dispose();

            }
            catch (ObjectDisposedException)
            {
                //yum
            }
    }
}