2014-09-29 34 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文件。