如何在EF7 Core中更改運行時的連接字符串?

c# entity-framework-core

我正在構建系統,每個客戶都擁有自己的數據庫。當客戶登錄時,我將使用用戶電子郵件地址的域名來決定它應該使用哪個連接字符串。

今天,connectionstring在startup.cs文件中設置,但這不起作用。

我的問題是:在EF Core中實現基於規則的連接字符串選擇的最佳方法是什麼?

用戶登錄後,該用戶應在其整個會話期間使用相同的連接字符串。

一般承認的答案

將連接字符串存儲在配置文件中,在我的情況下,我正在使用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配置:

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


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow