使用静态属性返回DbContext是否有任何问题

时间:2012-04-09 22:54:55

标签: asp.net-mvc-3 entity-framework

我一直在尝试使用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属性定义为静态会导致多用户场景中的任何问题吗?

2 个答案:

答案 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请求之间保持上下文可用?你想避免实例化吗?