如何在运行时更改 EF7 Core 中的连接字符串?

How do I change connectionstring at runtime in EF7 Core?

我正在构建系统,每个客户都将拥有自己的数据库。 当客户登录时,我将使用用户电子邮件地址的域名来决定它应该使用什么连接字符串。

今天,连接字符串已在 startup.cs 文件中设置,但这不会起作用。

我的问题是: 在 EF Core 中实现基于规则的连接字符串选择的最佳方式是什么?

用户登录后,该用户应在 his/her 整个会话期间使用相同的连接字符串。

将您的连接字符串存储在配置文件中,在我的例子中,我使用的是 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 class:

public class DataContext: DbContext
{
    public DataContext(DbContextOptions options) : base(options)
    { 
    }
}

你也可以通过依赖注入来完成。对于这个示例,我使用 Autofac :

创建 ConnectionString class:

public class ConnectionStringDto
{
    public string ConnectionString { get; set; }
}

Autofac 配置:

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 class:

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