C# .Net Core-根据环境更改数据库迁移

C# .Net Core-根据环境更改数据库迁移,c#,entity-framework-core,.net-core,C#,Entity Framework Core,.net Core,因此,我试图找出在开发中针对PostgreSQL数据库和生产中针对SQL Server数据库运行应用程序的黄金路径。困难的部分是迁移会有所不同。目前,我的做法是: public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ApplicationDbContext>(SetDbContextOptionsForEnvironment, ServiceLifetime.Tran

因此,我试图找出在开发中针对PostgreSQL数据库和生产中针对SQL Server数据库运行应用程序的黄金路径。困难的部分是迁移会有所不同。目前,我的做法是:

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"]);
  }
}
public void配置服务(IServiceCollection服务)
{
services.AddDbContext(setDbContextOptions for环境,ServiceLifetime.Transient);
}
私有void设置DBContextOptions ForEnvironment(DBContextOptions生成器选项)
{
如果(_environmentName==“生产”){
使用SQLServer(配置[“数据:默认连接:连接字符串]);
}
否则{
使用npgsql(配置[“数据:默认连接:连接字符串]);
}
}

将迁移保留在单独程序集中并在选项中指定该程序集的首选方法是什么?因此,我还需要在这些程序集中对同一DbContext有多个定义?

在思考了很长一段时间后,我认为这是一种反模式。不管我的特定用例是什么(dev中的postgres,prod中的sqlserver),我认为不赞成为不同的环境使用不同的数据库系统,因为部署后可能会出现意外问题。最好在开发和生产中使用相同的指令。

您可以使用预处理器指令来控制这一点。在开发中为您创建一个新的构建,为postgre开发人员定义一个条件编译符号,并使用预处理器指令在实现之间切换
#if postgreeftude/*pgre*/#else/*ss*/#endif
我认为预处理器指令在这里没有帮助。环境是已知的。问题是如何为两个不同的目标数据库分别维护迁移集合。好吧,我想我还不清楚。这是非常特定于.NETCore的。环境在运行时是已知的。我们总是知道它的生产与否。这个问题与维护不同的实体框架代码集有关。@user2322026:我删除了我的答案,因为它似乎与您所问的问题没有任何相似之处,而且我对您所使用的给出非一般性答案的细节了解不够。我很抱歉误解了你的意思!感谢您的耐心和回复!作为一个更新,我最终在PostgreSQL和MSSQL服务器上实现了这一点。但是,我还包括了这两种实现的验收测试。我没有试图维护一组对这两个提供商都有效的迁移,而是将其拆分为单独的项目(MyApp.migrations.SqlServer和MyApp.migrations.PostgreSql),并为这两个项目运行迁移。