我首先使用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
,它可以正常工作。
有谁能告诉我如何让这个工作?有没有替代使用环境变量可能仍然保持我的连接字符串的秘密?据我所知,用户机密只能用于网络项目。
答案 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
。
长而短,文档硬编码连接字符串是有原因的。没有理由不对其进行硬编码,因为它只能是一个使用过的连接字符串。