【问题标题】:Confusion on Static DB Context对静态数据库上下文的困惑
【发布时间】:2014-01-29 18:35:33
【问题描述】:

我设置了以 after a post here on stackoverflow 为模型的 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_request 上的 global.asax 中设置,如下所示:

    void Application_EndRequest(object sender, EventArgs e)
    {
        var db = (MyDbContext)HttpContext.Current.Items["_db"];
        if (db != null)
            db.Dispose();
    }

这样,在我的整个系统中,我都可以像DbContext.Db.xxxx一样访问数据库

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

我的担忧...

I read this post on stackoverflow 现在让我担心多个用户访问静态上下文可能会出现数据问题。这应该让我担心还是我的设置方式可以?

【问题讨论】:

    标签: c# asp.net ef-code-first dbcontext


    【解决方案1】:

    设置没问题...

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

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

    【讨论】:

    • +1 在这里,这绝对是好的。这就是 Items 容器的用途。
    • +1,“静态上下文”根本不是静态的。相反,静态方法用于实例化或返回当前 HTTP 请求的 DB 上下文,视情况而定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多