2017-03-06 58 views
3

我與實體框架核心的Asp.Net核心應用程序,我初始化如下:實體框架在同一個DBContext上核心多個連接字符串?

services.AddDbContext<ApplicationDbContext>(options => 
     options.UseSqlServer(sqlConnectionString)); 

這工作得很好,但我有一種情況,我需要從正常運行的主數據庫的讀/寫但對於需要從備用服務器讀取的某些操作(複製目標是隻讀的,用於報告)。

隨着新的Core API通過依賴注入和StartUp.cs中的配置完成所有工作,我該如何切換連接字符串,但使用相同的ApplicationDbContext類?

我知道一個選項將有一個ApplicationDbContext類的副本,我使用不同的連接字符串向DI系統註冊,但我想避免維護兩個相同的DBContext對象,因爲有時候我需要閱讀來自不同的數據庫服務器(但具有完全相同的模式)。

在此先感謝您的指點!

+0

我有點困惑,但你只是想能夠選擇什麼樣的數據庫進行連接的權限?一旦應用程序運行,這不會改變?如果是這樣,那麼'options.UseSqlServer'之前的條件就足夠了嗎?例如'if(Environment.GetEnvironmentVariable(「FIRSTENVIRONMENT」)options.UseSqlServer(「firstEnvironementConnectionString」)else options.UseSqlServer(「secondEnvironementConnectionString」)' – Adrian

+0

這個5分鐘編輯,反正這裏是固定代碼 'if(Environment.GetEnvironmentVariable(「 FIRSTENVIRONMENT「)==」environmentString「)options.UseSqlServer(」firstEnvironementConnectionString「)else options.UseSqlServer(」secondEnvironementConnectionString「)' – Adrian

+0

這將設置連接字符串在應用程序級別,我需要它設置在方法級別。字,一行代碼寫入數據庫A,下一行代碼讀取數據庫B.兩者使用相同的模式,只是在不同的數據庫上運行。 – user1142433

回答

3

您將需要兩個DbContext。

public class BloggingContext : DbContext 
{ 
    public DbSet<Blog> Blogs { get; set; } 
    public DbSet<Post> Posts { get; set; } 
} 

public class MyBloggingContext : BloggingContext 
{ 

} 

public class MyBackupBloggingContext : BloggingContext 
{ 

} 

你可以這樣他們註冊:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddDbContext<MyBloggingContext>(options => 
     options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

    services.AddDbContext<MyBackupBloggingContext>(options => 
     options.UseSqlServer(Configuration.GetConnectionString("BackupConnection"))); 

} 
+0

Dangit!非常明顯,我試圖通過EF API解決它剛剛使用繼承。謝謝! – user1142433

相關問題