C# 更改不同用户的连接字符串

C# 更改不同用户的连接字符串,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我的应用程序使用代码优先的方法&实体框架6.0 我的要求是,当用户a在连接字符串AppSchema中登录时,应将其用于整个应用程序;当用户B在连接字符串AppSchema1中登录时,应使用。我的应用程序非常大,我想从一个中心位置实现这一点 代码如下:- 连接字符串:- <add name="AppSchema" connectionString="Data Source=Server1\MSSQLSERVER2014;Initial Catalog=MSchema;Integrated

我的应用程序使用代码优先的方法&实体框架6.0

我的要求是,当
用户a
在连接字符串
AppSchema
中登录时,应将其用于整个应用程序;当
用户B
在连接字符串
AppSchema1
中登录时,应使用。我的应用程序非常大,我想从一个中心位置实现这一点

代码如下:-

连接字符串:-

 <add name="AppSchema" connectionString="Data Source=Server1\MSSQLSERVER2014;Initial Catalog=MSchema;Integrated Security=True;Persist Security Info=True;" providerName="System.Data.SqlClient" />

有人能建议怎么做吗?

用连接字符串的名称重载DbContext的构造函数

 public class ExampleDBContext : DbContext
    {
    public ExampleDBContext(string nameOrConnectionString) : 
       base(nameOrConnectionString)
    {

    }
}
在实例化DbContext时,传递已配置的连接字符串或连接字符串的名称

  var context = new ExampleDBContext ( "set name Or ConnectionString in run time");

您可以创建一个返回连接字符串架构名称的静态方法。例如:

Public static String GetSchema()
{
string schemaName;
var userName=Session["UserName"];
switch (userName)
    {
    case "User A":
        schemaName="AppSchema";
        break;
        case "User B":
            schemaName="AppSchema1";
        break;
        default:
            schemaName="DefaultSchema";
}

return schemaName;
}
将此方法称为

using (var ctx = new ApplicationDbContext(SomeClassName.GetSchema()))
{
    ....
    ctx.tblEmployee.Add(mod);
}

你可以这样做

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IDbModelCacheKeyProvider, IDisposable
{
        public ApplicationDbContext(string connection)
            : base(connection)
        {            
            ...
        }
以及任何适合于您的结构的逻辑,用于按用户区分连接字符串

public string GetDbConnectionByUser(string user)
{

}

如果您可以花更多的时间来改进,请参阅

首先连接父数据库,然后通过布尔标记区分用户应使用哪个数据库。如果根据用户选择数据库连接字符串,则从何处获取用户?这种方法难道不意味着设计有问题吗?如果您正在寻找类似saas的应用程序,请查看多租户体系结构,每个租户有不同的模式!我希望你不会收到很多这样的特殊情况。否则,这将是一个相当大的转变:)
using (var ctx = new ApplicationDbContext(SomeClassName.GetSchema()))
{
    ....
    ctx.tblEmployee.Add(mod);
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IDbModelCacheKeyProvider, IDisposable
{
        public ApplicationDbContext(string connection)
            : base(connection)
        {            
            ...
        }
var connection = GetDbConnectionByUser(string user);
using (var ctx = new ApplicationDbContext(connection))
{
    ....
}
public string GetDbConnectionByUser(string user)
{

}