2012-04-09 22 views
2

我一直在努力实现与实体框架4.1,它实例上的Application_BeginRequest中的DbContext一个新的MVC3项目中的任何问题,并配置它Application_EndRequest是否有与使用静态属性返回的DbContext

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(); 
    } 

我的问题是,将定义我目前的财产为静态造成任何问题在多用户的情况?

+0

相关http://stackoverflow.com/questions/6987908/what-is-the-best-way-to-instantiate-and-dispose-dbcontext-in-mvc/6990244#6990244 – Eranga 2012-04-10 00:28:48

回答

-1

您在DbContext上的生命周期太长了。每个请求最少应有一个,每个访问数据库最好一个。

-1

正如insta指出的那样,当你实际上need它应该实例化上下文。长时间使您的上下文寿命没有优势。

作为一个侧面说明,不需要明确调用Dispose方法,因为.NET垃圾收集器将为您更高效地执行此操作。

您可以为每个类实例上下文,因为您使用的是MVC,每个Controller实例上下文一次。

public class MyTableObjectController : Controller 
{ 
    MyContext context = new MyContext(); 

    public ActionResult Index() 
    { 
     var model = context.MyTableObjects; 

     return View(model); 
    } 
} 

我可能会问,你为什么试图保持开始和结束请求之间的上下文可用?你想避免实例化吗?

+0

这是一个很好的问题。我们试图避免的问题是当我们引用该对象时可怕的“dbcontext已被处置”。如果这是更好的方法,我愿意在控制器中实例化上下文。 – jazza1000 2012-04-09 23:54:14

+0

@ jazza1000我也有理解为什么当我第一次开始使用MVC 3时处置上下文的问题。也许这个问题的答案(http://stackoverflow.com/questions/5360372/)将帮助你。 – 2012-04-10 00:01:50

+0

您可能想要测试我的建议,您可能不想在实际项目中“尝试”它,但始终可以制作一个新的小型项目并对其进行测试,以了解它的行为方式以及是否适合使用该方法。 – Esteban 2012-04-10 18:48:20