2014-09-29 35 views
0

我正在構建一個應用程序,該應用程序將根據用戶在登錄時選擇的數據庫連接到同一模式的不同數據庫。所有後續查詢將由EntityFramework使用所選的數據庫進行。此刻我將這個數據庫名稱存儲在一個靜態變量中。這是正確的做法嗎?是通過靜態變量獲取EF數據庫名稱的好習慣

這是我做到的。

我在My Context中創建了一個靜態變量,當我在構造函數中創建上下文的新實例時,它調用Static變量。

public class MyContext : DbContext 
{ 
    public static string LoggedDatabase { get; set; } 

    static MyContext() 
    { 
     Database.SetInitializer<MyContext>(null); 
    } 

    public MyContext() 
     : base(GetConnectionString()) 
    { 
    } 

    private static string GetConnectionString() 
    { 
     if (string.IsNullOrWhiteSpace(LoggedDatabase)) 
      throw new ArgumentNullException("", "Database is not specified"); 
     var connBuilder = 
      new SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString) 
      { 
       InitialCatalog = LoggedDatabase 
      }; 
     return connBuilder.ToString(); 
    } 
+0

'static'是definetly不是要走的路。不確定你想要得到什麼樣的行爲,但它看起來像「只讀」更接近你的需求。 – Leron 2014-09-29 06:09:22

+0

我正在爲傳統應用程序構建基於Web的解決方案。每個部門共有9個共享相同模式的數據庫。用戶將從登錄屏幕中選擇數據庫,並根據選擇動態創建連接字符串。現在問題是在WPF和Asp.net客戶端共享上下文。所以我需要一個解決方案來解決這兩個要求。我希望我很清楚。 – 2014-09-29 10:45:16

回答

0

靜態變量將在其他字的所有會話之間共享,當用戶登錄所有其他用戶將使用最後一個用戶使用的數據庫,所以你需要到別的地方存放在會話中的值例如。

'public static string LoggedDatabase {get;組; } 您可以更改getter和setter方法的獲取和從會話對象

+0

我明白你的觀點。但問題是MyDbContext在不同的項目中,我也將它用於WPF客戶端。如果我按照您的建議修改屬性,它將創建與Asp.net的耦合。你能提出這方面的建議嗎? – 2014-09-29 10:15:52

+0

您可以添加另一個構造函數爲MyContext類public Public MyContext(string connectionString) :base(connectionString)不會破壞您的代碼在WPF項目或您>如果是這樣你也可以創建一個新的類,例如類DynamicContext:MyContext和使用它的WEB應用程序代碼併爲當前用戶調用基礎(connectionString) – 2014-09-29 14:15:17

+0

這是一個很好的暗示。感謝Aladin Hdabe。我會看看它。 :) – 2014-09-30 06:45:31

0

設定值時,您可以用ThreadStatic屬性創建變量LoggedDatabase和方法GetConnectionString,使每次獨特的每個線程。但這是一個錯誤的方式。

有幾種解決方案。

  1. 將它存儲在會話中。
  2. 儲存於數據庫
  3. 儲存於全局靜態詞典(用戶ID,LoggedDatabase)
  4. 儲存於外部XML文件。