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

相关问题