根据在多数据库MVC应用程序中选择的数据库选择特定的DBContext

时间:2015-01-29 02:30:49

标签: c# asp.net-mvc dbcontext

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

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

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

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

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

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

非常感谢任何见解/帮助。 谢谢!

2 个答案:

答案 0 :(得分:1)

"全局静态变量将存储所选的数据库" - 不要这样做。静态变量不应该在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);
}

答案 1 :(得分:1)

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中两个连接字符串的名称。

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