3

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

我想做的是有一个集中的登陆页面,用户被引导登录,然后根据他们的选择提供连接和编辑特定产品的选项。我们的想法是,我们将拥有一个 CMS 站点,该站点能够根据用户在数据库之间切换。将所有产品数据库组合到单个主产品数据库中不是一种选择。

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

4

2 回答 2

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 数据上下文实例的任何地方使用此方法。

于 2012-10-26T21:32:20.150 回答
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. 执行 SQL 工作以将其他网站的用户复制到此“UserMap”数据库​​中
  3. 在每个 CMS 数据库中编写一个触发器,以在用户在各自的 CMS 中创建或删除时添加或删除用户,以便更新“UserMap”数据库
  4. 修改 CMS 上的代码以使用这个单一数据库来查找应使用的连接字符串。

这将允许您依赖单个数据库进行查找,并以托管方式在它们之间切换。它需要一些前期工作,但在触发器出现后,您无需再做任何事情。

于 2012-10-26T22:10:48.583 回答