Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 单网站多数据库,数据库切换_Asp.net_Entity Framework - Fatal编程技术网

Asp.net 单网站多数据库,数据库切换

Asp.net 单网站多数据库,数据库切换,asp.net,entity-framework,Asp.net,Entity Framework,我已经为我公司的产品数据库创建了一个内容管理系统(CMS)。CMS基于asp.net脚手架,混合了许多自定义页面和操作。我们目前有7个产品,它们都共享相同的数据库模式(首先是实体框架模型),并且都在CMS中完美运行。问题是,每次我们获得新产品时,我们都必须克隆CMS并更改app.config中的连接字符串,以指向正确的数据库,以便使用新数据库。虽然这样做有效,但维护起来却越来越麻烦,而且随着我们获得更多的产品,这将使我们彻底失败 我想做的是有一个集中的登录页面,用户可以直接登录,然后根据他们的选

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

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


我不确定从何处开始实现这一目标,或者这是否是实现我的单一CMS维护目标的正确计划,我正在寻找这方面的一些指导

假设您的数据库结构相同,您可以在获取实体上下文实例的任何位置使用factory方法,并将逻辑放入其中以获取正确的连接字符串(或者,如果您可以使用命名约定,则可以计算它)。例如,类似的方法可能会起作用:

    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数据上下文实例的任何地方使用此方法,该实例将传入您在登录页上计算的产品名称。

为用户到数据库的映射创建另一个数据库。结构如下:

database UserMap 

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

    table Databases
       dbID (primary key)
       connectionString
那么

  • 填充表“Databases”中的数据库列表
  • 执行SQL操作,将其他网站的用户复制到此“UserMap”数据库中
  • 在每个CMS数据库中编写一个触发器,在用户在各自的CMS中创建或删除时添加或删除用户,以便更新“UserMap”数据库
  • 修改CMS上的代码,以使用此单一数据库查找应使用的连接字符串

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

    如果您必须在新内容出现时做任何事情,听起来不像是CMS……也就是说,您确定这里没有更根本的问题吗?或者,你的问题有点模棱两可。不,我不确定我没有更基本的问题。产品数据库系统是在我加入这家公司之前很久就创建的,目前我们所有的产品都假设他们的产品是产品数据库中唯一的产品。这意味着我们需要为每种产品建立不同的产品数据库。我只是在寻找一种方法,让CMS连接到相应的产品数据库,根据作者想要编辑的产品,而不是每个产品都有一个特定的CMS。对我来说,这听起来像是一个基本的设计缺陷。很好,我没有考虑过动态生成连接字符串。我有一个非常可预测的方法来确定我的连接字符串。谢谢你的例子。这也是一个很好的方法。因为我可以预测连接字符串,所以我认为另一种方法对我来说会更好。