我的应用程序使用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);
}
有人可以建议怎么做吗?
答案 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