我想在不同的环境中执行迁移。我正在使用实体框架和 ASP.NET 核心。现在我有这个:
public class TemporaryDbContextFactory : IDbContextFactory<ApplicationDbContext>
{
public ApplicationDbContext Create(DbContextFactoryOptions options)
{
var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
builder.UseSqlServer("Data Source=.\LOCALHOST;Initial Catalog=MyDB;Integrated Security=True;MultipleActiveResultSets=true");
return new ApplicationDbContext(builder.Options);
}
}
此代码位于将数据库交互与服务器代码分开的 DAL 类库中。
在执行迁移时可以使用它,但我真的不喜欢这样做。
这里的问题是我使用本地数据库进行开发,但我们还有一个开发服务器和一个具有不同连接字符串的暂存服务器。我无法做的是找到一种方法来不对该类中的连接字符串进行硬编码。
有没有办法为不同的环境配置连接字符串并指示在执行迁移时使用哪个连接字符串?
是的,您可以使用环境变量。
这就是为什么你有appsettings.<EnvironmentName>.json
ASP.NET 核心
中的配置不错Microsoft文章 使用多个环境
仅供参考
Environment.GetEnvironmentVariable
您需要将DbContextOptionsBuilder<ApplicationDbContext>
注入到工厂构造函数中,然后在主应用程序的Startup.cs
中配置 DbContext
public class TemporaryDbContextFactory : IDbContextFactory<ApplicationDbContext>
{
private readonly DbContextOptionsBuilder<ApplicationDbContext> optionsBuilder;
public TemporaryDbContextFactory(DbContextOptionsBuilder<ApplicationDbContext> optionsBuilder)
{
if(optionsBuilder==null)
throw new ArgumentNullException(nameof(optionsBuilder));
this.optionsBuilder = optionsBuiler;
}
public ApplicationDbContext Create(DbContextFactoryOptions options)
{
return new ApplicationDbContext(optionsBuilder.Options);
}
}
在启动.cs中:
services.AddDbContext<ApplicationDbContext>(options => {
options.UseSqlServer(Configuration.GetConnectionString("MyConnectionString"));
});
Configuration.GetConnectionString("MyConnectionString")
是Configuration["ConnectionStrings:MyConnectionString"]
的简写。