我正在开发一个项目,我们在是否在HTTP请求中缓存EF 6 DBContext时遇到了冲突。
对于每个HTTP请求,我们实例化多个类,我们可以在每个类上调用多个方法。
每个类实例的一个DBContext实例是最佳的,还是可以在HTTPContext.Cache中缓存单个Dbcontext?
其他因素:
我倾向于每个类的一个DBContext,但是其他人关心"新的DBContext"
我们不使用IoC / DI容器
我们没有进行有意的异步操作。
一些相关的答案来自2010年,我想确保这些答案是相关的
答案 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
}
}
}