1

我想在開發環境中運行SQLite數據庫,並在生產環境中運行SQLServer Express數據庫。在dotnet core 2的不同環境中運行不同的數據庫類型

我們首先使用代碼進行數據庫遷移。

如何在每個環境中注入不同的dbcontext?

如何針對特定數據庫運行遷移。例如。在開發過程中,我想要針對SQLite數據庫運行遷移。

+0

首先,你如何注入你的dbcontext?我假設你使用某種DI容器。您可以使用IHostingEnvironment並相應地注入適當的dbContext。要運行遷移,您需要指向一個項目並運行它。 「魔術」是遷移將使用的連接字符串。您可以使用相同的接口並在運行時獲取正確的接口。這只是想法..沒有實現這個自己,但我想這是一個開始。 – jpgrassi

+2

甚至更​​好:您可以有多個以您的環境爲目標的appsettings。所以:一個appsettings.Development.json和appsettings.Production.json。他們每個人都將有各自的連接字符串。然後,您只需使用來自appsettings的連接字符串配置您的dbContext,您將始終擁有這些連接字符串。 – jpgrassi

+0

@jpgrassi這就是我們目前所做的。但我想我需要一個不同的方法來添加一個sqlite db vs sqlserver。目前我們運行'services.AddDbContext (options => options.UseSqlServer(this.Configuration.GetConnectionString(「DBConnection」)));'但是要使用sqlite db,我認爲你需要調用'options.UseSqlite'。 –

回答

3

所以我想我找到了一個很好的方法讓你做到這一點。您可以使用ConfigureDevelopmentServices啓動約定來添加您的SQLSite DbContext。因此,正如一些基本的例子,你會:

// Production "like" ConfigureServices 
public void ConfigureServices(IServiceCollection services) 
{ 
    // Use Sql Server 
    services.AddDbContext<SchoolContext>(options => 
     options.UseSqlServer(Configuration.GetConnectionString("ProductionConnection"))); 
} 

// Development ConfigureServices 
public void ConfigureDevelopmentServices(IServiceCollection services) 
{ 
    // Use SQL Lite 
    services.AddDbContext<SchoolContext>(options => 
     options.UseSqlite(Configuration.GetConnectionString("DevelopmentConnection"))); 
} 

你甚至可以走得更遠,如果你碰巧有隻上演另一個不同的上下文中添加ConfigureStagingServices。爲了避免複製和粘貼公共服務,你可以有一個私有方法來註冊公共服務,並且只有特定的東西纔有獨立的方法。

現在對於遷移,我從來沒有測試過,但我最好的猜測是如果你有正確的dbContext和正確的連接字符串,遷移將正常工作。您只需指向EF項目並運行它。

+0

太好了。不知道「Configure Services()」約定。油滑。不幸的是遷移變得更加複雜,因爲Sqlite不支持sql server所做的所有遷移。但不確定有沒有簡單的答案。繼續前進,並將其標記爲已接受的答案。 –

+0

很高興幫助。是的..遷移總是很痛苦..很高興現在使用noSQl分貝:)。 – jpgrassi

相關問題