我有一个与 EF 配合使用的 Azure 函数应用程序,我想进行数据库迁移。
数据库上下文的代码有这部分:
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlServer(Utils.GetEnvironmentVariable("DB_ConnectionString"));
我尝试从包管理器控制台进行本地迁移,然后“DB_ConnectionString”应该来自 local.settings.json 文件。
问题是,在进行迁移时,由于某种原因无法读取环境变量,例如文件不存在。在 Visual Studio 中定期运行函数应用程序时,不会出现任何问题,并且正在读取文件中的值。另外,如果我在代码中显式创建一个
IConfiguration
并告诉它使用该文件,它也可以工作。我无法真正在代码中创建 IConfiguration,因为当函数应用程序在 Azure 中运行时,它会从其配置中读取环境变量,该环境变量的值与 local.settings.json 文件中的值不同。
如何才能使迁移能够读取 local.settings.json 文件?
使用包管理器控制台或 .NET Core CLI 运行迁移时,不会使用 Azure Functions 运行时,因此不会自动读取 local.settings.json 来填充环境变量。
在运行迁移之前,您可以在操作系统中设置环境变量来模仿 Azure 中的行为:
Windows:setx DB_ConnectionString“YourLocalConnectionString” MacOS/Linux:导出 DB_ConnectionString="YourLocalConnectionString" 然后运行迁移命令。这样,代码中的 Utils.GetEnvironmentVariable("DB_ConnectionString") 调用将获取本地连接字符串。
或者,如果您的 Azure Function 项目有 launchSettings.json,您可以在那里设置环境变量。运行迁移时,EF Core 工具将遵循这些设置。