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

时间:2017-03-31 05:20:40

标签: c# asp.net-mvc asp.net-mvc-4

我的应用程序使用Code first方法&实体框架6.0。

我的要求是当连接字符串User A中的AppSchema日志应该用于整个应用程序&当User B登录连接字符串AppSchema1时应该使用。我的应用程序非常庞大,我希望从中心位置实现这一目标。

以下是代码: -

连接字符串: -

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

连接字符串2: -

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

ApplicationDbContext: -

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IDbModelCacheKeyProvider, IDisposable
{
     public ApplicationDbContext(string schemaname)
                : base("AppSchema")
            {            
                SchemaName = schemaname;
                ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 180;
            }
}

使用: -

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

有人可以建议怎么做吗?

3 个答案:

答案 0 :(得分:0)

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

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

    }
}

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

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

答案 1 :(得分:0)

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

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);
}

答案 2 :(得分:0)

您可以执行类似

的操作
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IDbModelCacheKeyProvider, IDisposable
{
        public ApplicationDbContext(string connection)
            : base(connection)
        {            
            ...
        }

}

并创建DbContext对象

var connection = GetDbConnectionByUser(string user);
using (var ctx = new ApplicationDbContext(connection))
{
    ....
}

以及适合您的结构的任何逻辑,用于区分用户的连接字符串

public string GetDbConnectionByUser(string user)
{

}

如果您可以花更多时间进行改进,请参阅Multi-Tenant Data Architecture