Azure Function中如何将连接字符串传递给DLL?
我正尝试用现有项目的DLL创建Azure Function,已添加多个使用EFCore的DLL,想要将Azure Function的local.settings.json中的连接字符串传递给这些DLL。
已在local.settings.json中定义了连接字符串,但出现错误:
System.InvalidOperationException: 'No connection string named 'PEntities' could be found in the application config file.
我的Startup.cs代码如下:
public override void Configure(IFunctionsHostBuilder builder) { var context = builder.GetContext(); var config = context.Configuration; builder.Services.AddDbContext<PortalEntities>(x => x.UseSqlServer(config["PEntities"]); }
local.settings.json代码如下:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet", //"PEntities": "metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string="Server=localhost;Initial Catalog=Portal;Integrated Security=True;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30;application name=EntityFramework"" }, "ConnectionStrings": { "PEntities": "metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string="Server=localhost;Initial Catalog=Portal;Integrated Security=True;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30;application name=EntityFramework"" } }
我还尝试添加分部类来覆盖DLL中的现有类:
public partial class PortalEntities : DbContext { public PortalEntities(DbContextOptions<PortalEntities> options) : base(options) { } }
请问我遗漏了什么?
解决方案
1. 修正连接字符串读取方式
Azure Function的配置系统中,ConnectionStrings节点下的配置不能直接通过config["键名"]读取,需要使用IConfiguration.GetConnectionString()方法来获取:
修改Startup.cs代码:
public override void Configure(IFunctionsHostBuilder builder) { var context = builder.GetContext(); var config = context.Configuration; builder.Services.AddDbContext<PortalEntities>(x => x.UseSqlServer(config.GetConnectionString("PEntities"))); }
2. 确保分部类与原类匹配
你的分部类PortalEntities必须和DLL中的原类处于完全相同的命名空间,否则分部类无法和原类合并,依赖注入容器无法识别带DbContextOptions参数的构造函数,仍会尝试使用无参构造函数读取配置文件,导致错误。
3. 修正EFCore连接字符串格式
你的连接字符串包含EF6风格的元数据(metadata=res://*/...),这是EF6的配置格式,EFCore不需要这些内容。如果DLL中的PortalEntities是基于EFCore开发的,应改用纯SQL Server连接字符串:
更新local.settings.json中的连接字符串:
"ConnectionStrings": { "PEntities": "Server=localhost;Initial Catalog=Portal;Integrated Security=True;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30;application name=EntityFramework" }
如果DLL中的代码是基于EF6的,Azure Function对EF6的支持需要额外配置(比如添加App.config并配置连接字符串),但优先建议切换到EFCore的标准连接字符串格式。
内容的提问来源于stack exchange,提问作者ashhad

