在没有硬编码连接字符串的类库中执行asp.net核心EF迁移

时间:2017-03-27 09:53:42

标签: c# asp.net entity-framework asp.net-core environment-variables

我想在不同的环境中执行迁移。我正在使用Entity Framework和ASP.NET Core。现在我有这个:

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类库中,该库将数据库交互与服务器代码分开。

在执行迁移时可以使用它,但我真的不喜欢这样做。

这里的问题是我使用本地数据库进行开发,但我们还有一个开发服务器和一个具有不同连接字符串的登台服务器。我无法做的是找到一种不对该类中的连接字符串进行硬编码的方法。

有没有办法为不同的环境配置连接字符串并指明在执行迁移时要使用哪些?

2 个答案:

答案 0 :(得分:2)

是的,您可以使用环境变量。

这就是为什么你有appsettings.<EnvironmentName>.json

Configuration in ASP.NET Core
不错的微软文章abount Working with multiple environments


FYI
Environment.GetEnvironmentVariable

答案 1 :(得分:1)

您需要将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);
    }
}

在Startup.cs中:

services.AddDbContext<ApplicationDbContext>(options => {
    options.UseSqlServer(Configuration.GetConnectionString("MyConnectionString"));
});

Configuration.GetConnectionString("MyConnectionString")Configuration["ConnectionStrings:MyConnectionString"]的缩写。