我一直在尝试使用Entity Framework 4.1实现一个新的MVC3项目,该项目在Application_BeginRequest上实例化dbContext,并将其置于Application_EndRequest上
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类定义如下:
public class EntityContext : MyEntities, IDisposable
{
**//should this be static?**
public static EntityContext Current
{
get { return HttpContext.Current.Items["_EntityContext"] as EntityContext; }
}
void IDisposable.Dispose()
{
Current.Dispose();
}
我的问题是,将我的Current属性定义为静态会导致多用户场景中的任何问题吗?
答案 0 :(得分:0)
你在DbContext上的生命周期太长了。你应该每个请求至少旋转一个,每次访问数据库时更好一个。
答案 1 :(得分:0)
正如insta指出的那样,你应该在实际need
时实例化上下文。没有任何优势可以让你的上下文生命持续很长时间。
作为旁注,没有必要明确调用Dispose
方法,因为.NET垃圾收集器会为您更有效地执行此操作。
您可以为每个类实例化上下文,因为您正在使用MVC,每个Controller实例一次上下文。
public class MyTableObjectController : Controller
{
MyContext context = new MyContext();
public ActionResult Index()
{
var model = context.MyTableObjects;
return View(model);
}
}
我可能会问,为什么要在Begin和End请求之间保持上下文可用?你想避免实例化吗?