gpt4 book ai didi

c# - Azure Functions 环境变量始终为 null

转载 作者:行者123 更新时间:2023-12-05 08:30:50 25 4
gpt4 key购买 nike

在我的 V3 函数项目中,我尝试连接 Entity Framework 并从环境变量传递连接字符串。

在我的 local.settings.json 文件中,我有:

{
"Values" : {
"SqlConnectionString" : "<localdb connection string here>"
}
}

我正在按照this blog post使用IDesignTimeContextFactory连接上下文。 :

public class ContextFactory : IDesignTimeDbContextFactory<Context>
{
public Context CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<Context>();
var connectionString = Environment.GetEnvironmentVariable("SqlConnectionString", EnvironmentVariableTarget.Process);
optionsBuilder.UseSqlServer(connectionString);

return new Context(optionsBuilder.Options);
}
}

当我尝试添加迁移时,connectionString 为空。

谁能看出这里出了什么问题吗?

编辑:

按照建议,我还尝试定义连接字符串并注入(inject) IConfiguration,如下所示:

    public class ContextFactory : IDesignTimeDbContextFactory<Context>
{
private readonly IConfiguration _configuration;

public ContextFactory(IConfiguration configuration)
{
_configuration = configuration;
}

public Context CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<Context>();
optionsBuilder.UseSqlServer(_configuration.GetConnectionString("SqlConnectionString"));

return new Context(optionsBuilder.Options);
}
}

但我得到以下异常:

System.MissingMethodException: No parameterless constructor defined for type 'EbayTools.Functions.Domain.ContextFactory'.

最佳答案

说明

我在遵循同一篇博客文章/教程时遇到了同样的问题!

运行 Entity Framework Core CLI 工具时,local.settings.json 中的值不会添加到环境变量列表中。您可以通过提示调试器运行来检查这一点(参见代码)。

为了在运行 Entity Framework Core CLI 命令时访问 local.settings.json 中的值,我使用了 ConfigurationBuilder(再次参见下文)。

最后,我将连接字符串存储在 local.settings.json 文件的“Values”下,而不是 ConnectionStrings 下。


解决方案

ProjectContextFactory.cs

public class ProjectContextFactory : IDesignTimeDbContextFactory<ProjectDbContext>
{
public ProjectDbContext CreateDbContext(string[] args)
{
// Prompt debugger to open when running ef cli command.
// Remove this when you no longer need to debug
Debugger.Launch();

// See that environment variables list doesn't contain your key value and therefore connectionString variable returns null
var variables = Environment.GetEnvironmentVariables();
var connectionString = Environment.GetEnvironmentVariable("SQLDB_CONNECTIONSTRING");

// Setup config
var config = new ConfigurationBuilder()
.SetBasePath(Path.Combine(Directory.GetCurrentDirectory()))
.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();

// Get connection string from config
var connectionString = config.GetValue<string>("Values:SQLDB_CONNECTIONSTRING");

var optionsBuilder = new DbContextOptionsBuilder<ProjectDbContext>();
optionsBuilder.UseSqlServer(connectionString);

return new ProjectDbContext(optionsBuilder.Options);
}
}

本地.settings.json

{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"SQLDB_CONNECTIONSTRING": "<connectionString>
}
}

关于c# - Azure Functions 环境变量始终为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62356340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com