3

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

4

2 回答 2

0

您在 DbContext 上的寿命太长了。您应该为每个请求至少启动一个,甚至更好的是每次访问数据库。

于 2012-04-09T22:56:57.017 回答
0

正如 insta 指出的那样,您应该在实际使用上下文时实例化上下文need。让你的上下文生命周期那么长没有任何好处。

附带说明一下,不需要显式调用该Dispose方法,因为 .NET 垃圾收集器会更有效地为您执行此操作。

您可以为每个类实例化上下文,因为您使用的是 MVC,所以每个控制器实例化一次上下文。

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

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

        return View(model);
    }
}

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

于 2012-04-09T23:48:15.663 回答