C# 更改不同用户的连接字符串
我的应用程序使用代码优先的方法&实体框架6.0 我的要求是,当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
用户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)
{
}