C# 静态数据库上下文的混淆

C# 静态数据库上下文的混淆,c#,asp.net,ef-code-first,dbcontext,C#,Asp.net,Ef Code First,Dbcontext,我在这里设置了DbContext 这是当前设置 public static class DbContext { public static MyDbContext Db { get { if (!HttpContext.Current.Items.Contains("_db")) { HttpContext.Current.Items.Add("_db", new My

我在这里设置了DbContext

这是当前设置

public static class DbContext
{
    public static MyDbContext Db
    {
        get
        {
            if (!HttpContext.Current.Items.Contains("_db"))
            {
                HttpContext.Current.Items.Add("_db", new MyDbContext());
            }
            return HttpContext.Current.Items["_db"] as MyDbContext;
        }
    }
}
在end_请求时,上下文在global.asax中进行如下处理:

    void Application_EndRequest(object sender, EventArgs e)
    {
        var db = (MyDbContext)HttpContext.Current.Items["_db"];
        if (db != null)
            db.Dispose();
    }
这样,在整个系统中,我可以像
DbContext.Db.xxxx

到目前为止,我在本地运行的一切都很好,但是,我还没有在生产环境中对多个用户进行测试

我的担忧…

现在我担心多个用户访问静态上下文可能会出现数据问题。这是否与我有关,或者我的设置方式是否正常?

设置是否正常

我的解决方案不使用静态DbContext。DbContext(或任何需要的内容)存储在
HttpContext.Current.Items
集合(即特定于当前HTTP请求的集合)中,该属性相当于一个方法调用,该方法调用将从此集合中检索上下文,并在需要时对其进行实例化。选择此集合是因为它的安全性,而且可以很容易地从任何地方(即从应用程序_EndRequest事件)引用它,因此我们可以在完成后处理它


你链接的帖子有很大的不同,因为它描述了一种使用
静态字段的情况。该字段显然将在所有用户之间共享,这将是一个大问题。

+1在这里,这绝对是好的。这就是
Items
容器的作用。+1,“静态上下文”根本不是静态的。而是使用静态方法来实例化或返回当前HTTP请求的DB上下文(视情况而定)。