2016-08-19 131 views
2

因此,我试图弄清楚在开发中运行应用程序的PostgreSQL数据库和生产中的SQL Server数据库的应用程序的黄金路径。困难的部分是迁移将有所不同。目前,我的做法是这样的:.Net Core - 根据环境更改数据库迁移

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddDbContext<ApplicationDbContext>(SetDbContextOptionsForEnvironment, ServiceLifetime.Transient); 
} 

private void SetDbContextOptionsForEnvironment(DbContextOptionsBuilder options) 
{ 
    if(_environmentName == "production") { 
    options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]); 
    } 
    else { 
    options.UseNpgsql(Configuration["Data:DefaultConnection:ConnectionString"]); 
    } 
} 

是保持在一个单独的组件中的迁移和指定组件的选项首选的方法是什么?那么我需要在这些程序集中拥有多个相同DbContext的定义?

+0

您可以使用预处理器指令来控制它。在开发过程中为您创建一个新的构建,为postgre devs定义一个条件编译符号,并使用预处理器指令在实现之间切换... #if POSTGREWTFDUDE/* pgre * /#else */ss * /#endif' – Will

+0

认为预处理器指令在这里有帮助。环境是已知的。问题是如何为两个不同的目标数据库维护单独的迁移集合。 – jaredcnance

+0

好吧我想我不清楚。这对于.Net核心来说非常具体。环境在运行时是已知的。我们一直知道它的生产与否。这个问题涉及维护不同的实体框架代码第一次迁移.. – jaredcnance

回答

-1

在思考了很长一段时间之后,我认为这是一种反模式。无论我的特殊用例(开发中的postgres,prod中的SQL Server),我认为在不同的环境中使用不同的数据库系统是不可取的,因为在部署之后可能会有意想不到的问题。最好坚持与开发和生产相同的一个。

+0

作为一个更新,我最终实现了PostgreSQL和MSSQL Server。但是,我还包括两种实施的验收测试。我没有试图维护适用于这两个提供程序的单一迁移集,而是将其分成单独的项目(MyApp.Migrations.SqlServer和MyApp.Migrations.PostgreSql)并为两者运行迁移。 – jaredcnance