You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Function中如何将连接字符串传递给DLL?

问题:Azure Function中传递连接字符串给EFCore 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=&quot;Server=localhost;Initial Catalog=Portal;Integrated Security=True;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30;application name=EntityFramework&quot;"
},
"ConnectionStrings": {
"PEntities": "metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;Server=localhost;Initial Catalog=Portal;Integrated Security=True;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30;application name=EntityFramework&quot;"
  }
}

我还尝试添加分部类来覆盖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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 12:18:18