2016-05-02 51 views
1

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

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

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

用戶登錄後,該用戶應在他/她的整個會話中使用相同的連接字符串。

回答

0

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