C# MVC5在运行时更改数据库连接字符串

C# MVC5在运行时更改数据库连接字符串,c#,asp.net,asp.net-mvc,connection-string,C#,Asp.net,Asp.net Mvc,Connection String,我正在考虑使用MVC5来补充现有的ASP.Net应用程序(不是MVC) 已首先使用数据库配置应用程序 我需要在运行时根据登录的用户更改数据库连接字符串。(在当前的应用程序中,通过数据适配器很容易做到这一点) 现有数据库超过1000个,在运行时可以创建更多的数据库,因此Web.config不是一个选项。模式对于所有数据库都是通用的 到目前为止,我已经成功地在控制器上切换了数据库-但这意味着要对生成的代码进行实质性的更改-必须有一种更简单的方法救命啊 补充评论: 该模型是一个SaaS会计应用程序。每

我正在考虑使用MVC5来补充现有的ASP.Net应用程序(不是MVC)

已首先使用数据库配置应用程序

我需要在运行时根据登录的用户更改数据库连接字符串。(在当前的应用程序中,通过数据适配器很容易做到这一点)

现有数据库超过1000个,在运行时可以创建更多的数据库,因此Web.config不是一个选项。模式对于所有数据库都是通用的

到目前为止,我已经成功地在控制器上切换了数据库-但这意味着要对生成的代码进行实质性的更改-必须有一种更简单的方法救命啊

补充评论:

该模型是一个SaaS会计应用程序。每个数据库存储客户公司的所有分类账,其中大约有125个表。为了安全性和可移植性,它们被分开保存(一些会计师甚至要求为他们的客户下载完整的SQL数据)

示例代码:

该站点基于Contoso大学模型:

它以其基本形式工作,但我需要更改每个客户端数据的连接: 因此,查看销售分类账-在Sales controller下,我们有:

public class SalesController : Controller
{

    private Sales db = new Sales();

销售定义为:

public partial class Sales : DbContext
{

    public Sales()
        : base("name=Sales")
    {                                                                        
    }
“name=Sales”链接到WebConfig并为其提供起始数据库

查看:base定义将我带到System.Data.Entity.DbContext,它是一个锁定的文件

我已经浏览了各种网站,并尝试将连接字符串放在Sales类中,以下是建议之一:

公开销售(字符串connString):基本(字符串connString)

但这会引发:

如果在代码优先模式下使用,则使用T4模板为数据库优先和模型优先开发生成的代码可能无法正常工作。要继续先使用数据库或先使用模型,请确保在正在执行的应用程序的配置文件中指定了实体框架连接字符串。要使用这些类(首先来自数据库或首先来自模型),请使用代码首先使用属性或DbModelBuilder API添加任何其他配置,然后删除引发此异常的代码

第32行:模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)

第33行:{

第34行:抛出新代码FirstException()

第35行:}

第36行:

这就是我被卡住的地方-即使我使用与WebConfig中相同的连接字符串


(它提到了“代码优先”模式-它不是吗?

您可以让您的数据访问层访问提供其使用的连接字符串的接口?同样,如果使用EF,它可能是上下文而不是连接字符串

public interface class IClient
{
    string ConnectionString {get;set;}
}

public class DataAccess
{
    private IClient _connectionString;

    public DataAccess(IClient client)
    {
        _connectionString = client.ConnectionString;
    }
}
当然,这将根据您的设计稍微改变。我可能会对同一数据库上的所有客户机进行身份验证,然后根据谁对工厂进行身份验证,工厂可以返回一个IClient,然后DAL、存储库或您拥有的任何东西都可以使用该IClient。IClient实际上不仅仅有一个连接字符串或上下文,您还可以有其他与需求相关的属性或方法


在内部,存储库(例如)可能会在构造函数中使用该上下文或连接字符串,因此它会建立正确的连接。方法不会更改。

添加一个新的参数化构造函数,如下所述。 在“Connectionstring”中,按如下方式传递连接:

string Connectionstring="Data Source=;Initial Catalog=abc;Persist Security Info=True;
User ID=dsds;Password=dsdsd;MultipleActiveResultSets=True";

 public Sales()
        : base("name=Sales")
    {                                                                        
    }

        public Sales(string Connectionstring)
            : base(Connectionstring)
        {

        }

可能重复1000个或更多数据库?为什么会有这么多数据库?因为有时您会发现自己所在的现有(而且是成功的)企业没有针对多租户情况的典型SaaS体系结构,但有1000个客户机—可能不可能在短时间内将应用程序重新构建到一个或几个数据库中。此外,一些政府客户具有合法性,因此数据库需要驻留在其所在地,这迫使企业为每个客户都有单独的数据库,尽管具有相同的模式以便于管理。@kaf如果您有1000个客户,您可能会发现,为了客户的利益,一个单独的数据库并不是一个糟糕的主意。你认为汇丰银行和苏格兰银行会想要共享Db?我同意。我的组织拒绝了与以各种方式管理数据的企业签订的合同,因为他们错误地认为将所有客户信息放在一个数据库中是一个好主意。