带有实体框架的ASP.NET核心 - 代码首次迁移不会读取我的环境变量

时间:2018-04-19 13:14:53

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

我首先使用Entity Framework代码获得ASP.NET Core 2 Web API。我的DbContext与API本身不在同一个程序集中,因此为了允许我使用Microsoft.EntityFrameworkCore.Tools.DotNet工具我已将IDesignTimeDbContextFactory<MyDbContext>的实现添加到DbContext项目:

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<MyDbContext>
{
    private static IConfiguration _configuration;

    public static IConfiguration Configuration
    {
        get
        {
            if (_configuration != null) return _configuration;

            _configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{EnvName ?? "Production"}.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();

            return _configuration;
        }
    }

    public MyDbContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<MyDbContext>();
        var connectionString = Configuration.GetConnectionString("MyConnString");
        var migrationsAssembly = typeof(MyDbContext).GetTypeInfo().Assembly.GetName().Name;

        builder.UseSqlServer(connectionString, b => b.MigrationsAssembly(migrationsAssembly));

        return new MyDbContext(builder.Options);
    }
}

我在这个项目中没有appsettings.json,但我添加了一个名为ConnectionStrings:MyConnString的系统环境变量和我的连接字符串的值。

当我运行dotnet ef migrations add "Whatever"之类的工具命令时,我收到错误,说连接字符串不能为空。所以我猜配置构建器不会读取我的环境变量。如果我用一个硬编码的连接字符串替换变量connectionString,它可以正常工作。

有谁能告诉我如何让这个工作?有没有替代使用环境变量可能仍然保持我的连接字符串的秘密?据我所知,用户机密只能用于网络项目。

1 个答案:

答案 0 :(得分:0)

顾名思义,

let links = [ { id: "link-0", url: "www.howtographql.com", description: "Fullstack tutorial for GraphQL", }, ] const resolvers = { Mutation: { updateLink(root, args) { const linkIndex = links.findIndex(link => link.id === args.id); const state = links.map(link => { debugger; if (link.id === args.id) { const map = Map(link); return map .set("url", args.url || link.url) .set("description", args.description || link.description); } return link; }); links = state; return state[linkIndex]; }, } 仅适用于开发。它不支持或真正有任何环境概念。它只是一种针对类库运行迁移的方法,因为它不是一个启动项目,所以无法实际注入IDesignTimeDbContextFactory

长而短,文档硬编码连接字符串是有原因的。没有理由对其进行硬编码,因为它只能是一个使用过的连接字符串。