我正在构建系统,每个客户都拥有自己的数据库。 当客户登录时,我将使用用户电子邮件地址的域名来决定它应该使用哪个连接字符串。
今天,connectionstring在startup.cs文件中设置,但这不起作用。
我的问题是: 在EF Core中实现基于规则的连接字符串选择的最佳方法是什么?
用户登录后,该用户应在其整个会话期间使用相同的连接字符串。
答案 0 :(得分:1)
将您的连接字符串存储在配置文件中,在我的情况下,我正在使用appsettings.json
文件。
var builder = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
var connectionString = builder["Data:DefaultConnection:ConnectionString"];
var optionsBuilder = new DbContextOptionsBuilder();
optionsBuilder.UseSqlServer(connectionString);
var context = new DataContext(optionsBuilder.Options);
和DataContext
类:
public class DataContext: DbContext
{
public DataContext(DbContextOptions options) : base(options)
{
}
}
也可以通过依赖注入来实现。对于此示例,我正在使用Autofac
:
创建ConnectionString
类:
public class ConnectionStringDto
{
public string ConnectionString { get; set; }
}
Autofac
config:
var configBuilder = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
var connectionString = new ConnectionStringDto { ConnectionString = configBuilder ["Data:DefaultConnection:ConnectionString"]; };
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterInstance(connectionStringDto).AsSelf().SingleInstance();
containerBuilder.RegisterType<DataContext>().AsSelf().InstancePerLifetimeScope();
和DataContext
类:
public class DataContext : DbContext
{
private readonly ConnectionStringDto _connectionString;
public DataContext(ConnectionStringDto connectionString)
{
_connectionString = connectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
optionsBuilder.UseSqlServer(_connectionString.ConnectionString);
}
.
.
.