多库MVC应用中根据选择的数据库选择具体的DBContext

Choosing specific DBContext according to database selected in multi-database MVC application

我正在尝试构建一个 ASP.Net MVC 应用程序,它根据用户选择的数据库更新数据库值。

我是如何设计它的,方法是创建 2 个 EF DB 模型(每个模型代表一个数据库)。两个数据库基本上具有相同的 table 结构,只是数据不同,因为每个数据库指向不同的环境。

全局静态变量将存储选定的数据库(由用户通过下拉列表选择)。

我的想法是controller根据这个全局静态变量实例化正确的DBContext,DBContext对象就可以使用了。

几个问题: - 我解决问题的架构是否正确? - 如果是,我如何在每个控制器中相应地实例化 DBContext 变量。目前,实例化是在控制器启动时完成的:

private DB1 db = new DB1(); //Where DB1 is a subclass of DBContext. 

任何 insights/help 非常感谢。 谢谢!

"A global static variable will store the selected DB" - 不要这样做。静态变量不应保留用户在本质上是多用户和多线程的 Web 应用程序中的选择。如果数据库由用户选择确定,则将此选择存储在 Session - 因为单独的会话状态属于特定用户。

至于创建上下文,我建议按需进行:

private DB1 db = null; 
private DB1 Db
{
  get
  {
    if (db == null)
    {
      db = instantiate context according to user choice;
    }
    return db;
  }
}

并在其他地方使用 Db 属性。

记得在覆盖的Controller.Dispose方法中处理上下文:

protected override void Dispose(bool disposing)
{
  if (disposing && db != null)
    db.Dispose();
  base.Dispose(disposing);
}

DBContext 允许您传递连接字符串名称。 如果数据库结构相同,则使用单一模型!不要使用两个完全不同的模型,而是使用两个连接字符串。

只需使用让您传递连接字符串名称的构造函数重载:https://msdn.microsoft.com/en-us/library/gg679467(v=vs.113).aspx

然后在您的配置中,您有两个指向单独数据库的连接字符串,以及区分它们的 name= 属性。

if(userChoseFirst)
{
  db = new MyDbContext("firstConnection"); 
}
else
{
  db = new MyDbContext("secondConnection"); 
}

其中 firstConnection 和 secondConnection 是您 web.config 中两个连接字符串的名称。

使用工厂模式或有一个基本控制器来为您处理这个问题可能会很方便,这样您就不需要在任何地方重复它。