单个网站多个​​数据库,数据库切换

时间:2012-10-26 20:52:55

标签: asp.net entity-framework

我为公司的产品数据库创建了一个内容管理系统(CMS)。 CMS基于asp.net脚手架,其中混合了许多自定义页面和操作。我们目前有7个产品,所有产品共享相同的数据库模式(实体框架模型优先),并且都在CMS中完美运行。问题是,每次我们获得新产品时,我们必须克隆CMS并更改app.config中的连接字符串以指向正确的数据库以便使用新数据库。虽然这样做有效,但维护起来很麻烦,并且在我们获得更多产品时会完全失败。

我想要做的是拥有一个集中登陆页面,用户可以在其中登录,然后根据他们的选择选择连接和编辑特定产品。我们的想法是,我们将有一个CMS站点,可以根据用户在数据库之间切换。不能将所有产品数据库合并到单个主产品数据库中。

我不知道从哪里开始实现这一目标,或者这是否是实现我的目标,即维持单一CMS的正确计划,并且我正在寻找一些指导。

2 个答案:

答案 0 :(得分:2)

假设您的数据库结构相同,您可以在获得实体上下文实例的任何地方使用工厂方法,并在其中放置逻辑以获取正确的连接字符串(或者如果存在可以使用的命名约定则计算它)。像这样的东西可能会起作用:

    public static MyDatabaseEntities CreateEntityContext(string productName)
    {
        string connectionString = null;
        switch (productName.Trim().ToLower())
        {
            case "apples":
                connectionString = ConfigurationManager.ConnectionStrings["MyDatabase_Apples"].ConnectionString;
                break;
            case "pears":
                connectionString = ConfigurationManager.ConnectionStrings["MyDatabase_Pears"].ConnectionString;
                break;
            default:
                connectionString = ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString;
                break;
        }
        return new MyDatabaseEntities(connectionString);
    }

然后,只要您需要将CRM数据上下文实例传入您在目标网页上计算的产品名称,就可以使用此方法。

答案 1 :(得分:0)

为用户创建另一个数据库到数据库映射。结构就像这样:

database UserMap 

    table Users
       username (composite primary key)
       dbID (composite primary key, foreign key to "Databases" table)

    table Databases
       dbID (primary key)
       connectionString

然后,

  1. 填写表“数据库”
  2. 中的数据库列表
  3. 您的SQL是否将用户从其他网站复制到此“UserMap”数据库​​
  4. 在每个CMS数据库中编写触发器,以便在用户在各自的CMS中创建或删除用户时添加或删除用户,以便更新“UserMap”数据库​​
  5. 修改CMS上的代码,以使用此单个数据库查找应使用的连接字符串。
  6. 这将允许您依靠单个数据库进行查找,并以管理方式在它们之间切换。它需要一些前期工作,但在触发器出现后,您不必再做任何其他事情了。