امکان تغییر رشتهی اتصالی به بانک اطلاعاتی در EF Core در زمان اجرای برنامه
نویسنده: وحید نصیری
تاریخ: ۱۳۹۹/۰۷/۰۳ ۱۴:۱۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")
)); "ConnectionStrings": {
"ConnectionTemplate": "Data Source=.;Initial Catalog={db_Name};Integrated Security=True",
} services.AddDbContext<ApplicationDbContext>((serviceProvider, dbContextBuilder) =>
{
var connectionStringTemplate = Configuration.GetConnectionString("ConnectionTemplate");
var httpContextAccessor = serviceProvider.GetRequiredService<IHttpContextAccessor>();
var dbName = httpContextAccessor.HttpContext.Request.Headers["tenantId"].First();
var connectionString = connectionStringTemplate.Replace("{db_Name}", dbName);
dbContextBuilder.UseSqlServer(connectionString);
}); services.AddDbContext<MarketDbContext>((serviceProvider, dbContextBuilder) =>
{
var connectionStringTemplate = Configuration.GetConnectionString("Connection");
var httpContextAccessor = serviceProvider.GetRequiredService<IHttpContextAccessor>();
var dbName = httpContextAccessor.HttpContext.Session.GetString("databasename");
var connectionString = connectionStringTemplate.Replace("{db_Name}", dbName);
dbContextBuilder.UseSqlServer(connectionString);
}); HttpContext.Session.SetString("databasename", "DB1399"); var httpContextAccessor = serviceProvider.GetRequiredService<IHttpContextAccessor>();
namespace TestBackend
{
public class Startup
{
// ...
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddHttpContextAccessor();
// + services.AddSession() && app.UseSession()
services.AddDbContext<TestContext>((serviceProvider, options) =>
{
options.UseSqlServer(GetConnectionString(serviceProvider));
});
// ...
}
// ...
private string GetConnectionString(IServiceProvider serviceProvider)
{
var connectionStringTemplate = Configuration.GetConnectionString("ConnectionTemplate");
try
{
var httpContextAccessor = serviceProvider.GetRequiredService<IHttpContextAccessor>(); // This needs services.AddHttpContextAccessor();
var dbName = httpContextAccessor.HttpContext.Session.GetString("databasename"); // This needs services.AddSession(); && app.UseSession();
return connectionStringTemplate.Replace("{db_Name}", dbName);
}
catch(Exception ex)
{
var logger = serviceProvider.GetRequiredService<ILoggerFactory>().CreateLogger(nameof(Startup));
logger.LogError("GetConnectionString error", ex, "Failed to get connection string.");
}
return connectionStringTemplate.Replace("{db_Name}", "---Default-DB-Name-Here---");
}
}
} public class ConnectionStringInitializationInterceptor : DbConnectionInterceptor
{
public override async ValueTask<InterceptionResult> ConnectionOpeningAsync(
DbConnection connection, ConnectionEventData eventData, InterceptionResult result,
CancellationToken cancellationToken = new())
{
if (string.IsNullOrEmpty(connection.ConnectionString))
{
connection.ConnectionString = "new data ..." ;
}
return result;
}
}