通过静态变量获取EF数据库名称是一种好习惯

时间:2014-09-29 05:37:04

标签: c# asp.net-mvc entity-framework

我正在构建一个应用程序,该应用程序将根据用户在登录时选择的数据库连接到同一模式的不同数据库。所有后续查询都将由EntityFramework使用所选数据库进行。目前我将此数据库名称存储在静态变量中。这是正确的方法吗?

我是这样做的。

我在My Context中创建了一个静态变量,当我在构造函数中创建一个新的上下文实例时,它调用静态变量。

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

2 个答案:

答案 0 :(得分:0)

当用户登录所有其他用户将使用上一个用户使用的数据库时,静态变量将在其他单词的所有会话之间共享,因此您需要将值存储在Session中的其他位置。 / p>

&#39;公共静态字符串LoggedDatabase {get;组; } 您可以更改getter和setter以获取和设置会话对象的值

答案 1 :(得分:0)

您可以使用ThreadStatic属性创建变量LoggedDatabase和方法GetConnectionString,以使每个线程都具有唯一性。但这是一种错误的方式。

有几种解决方案。

  1. 将其存储在会话中。
  2. 将其存储在db
  3. 将其存储在全局静态字典(UserId,LoggedDatabase)
  4. 将其存储在外部xml文件中。
  5. 等等