我正在尝试构建一个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.
非常感谢任何见解/帮助。 谢谢!
答案 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中两个连接字符串的名称。
使用工厂模式或者有一个基本控制器为你处理这个问题可能很方便,所以你不需要在任何地方重复它。