2014-01-29 66 views
2

我設置我的DbContext建模after a post here on stackoverflow在這裏找到。混淆靜態數據庫上下文

這是當前設置...

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

的背景設置在Global.asax的上END_REQUEST像這樣:

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,現在有我擔心可能有多個用戶訪問靜態上下文數據的問題。這應該關注我還是以我的方式設置好?

回答

5

設置是好的...

我的解決方案不使用靜態DbContext。 DbContext(或任何需要的)被存儲在HttpContext.Current.Items集合中(這是一個當前的HTTP請求特定的),屬性相當於一個方法調用,它將從該集合中檢索上下文,並在需要時對其進行實例化。這個集合的選擇是爲了它的安全,事實上很容易從任何地方引用它(即來自Application_EndRequest事件),所以我們可以在完成後處置它。

您鏈接的帖子有很大的不同,因爲它描述了您使用static field的情況。這個領域顯然將在所有用戶之間共享,這將是一個大問題。

+1

+1在這裏,這絕對是好的。這是'Items'容器的用途。 –

+1

+1,「靜態上下文」根本不是靜態的。相反,靜態方法用於實例化或返回當前HTTP請求的數據庫上下文。 –