使用Azure Functions Core Tools本地运行耐久Azure函数出现EF Core报错
问题原因
这个错误的本质是Azure Functions Core Tools v4 运行时程序集与项目依赖的EF Core版本不兼容,和你代码里的ToDictionary逻辑无关,错误抛出在EF Core内部初始化阶段,还没有执行到读取数据库结果转换字典的步骤:
- EF Core的
EnumerableMethods静态构造函数会反射扫描System.Linq程序集获取标准查询运算符的方法定义 - Azure Functions Core Tools v4默认加载.NET 6及以上版本的基础类库,其中System.Linq的方法重载和EF Core 3.1.x版本扫描预期的重载不匹配,导致反射调用
Single方法时找到多个符合条件的结果,抛出对应异常 - Visual Studio调试时会优先使用项目指定的.NET Core 3.1运行时和对应版本的基础类库,所以不会触发冲突
解决方案
- 强制指定Core Tools使用.NET Core 3.1对应的函数运行时版本
在项目的local.settings.json的Values节点下添加配置:
"FUNCTIONS_WORKER_RUNTIME_VERSION": "~3"
重启函数服务即可,如果启动时提示找不到对应运行时,可以通过Core Tools安装v3版本的运行时组件。
- 显式开启绑定重定向
在你的函数项目.csproj文件的<PropertyGroup>节点下添加如下配置,解决程序集版本冲突:
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
重新编译项目后再执行func start启动。
- 降级Azure Functions Core Tools到v3版本
如果上面的方案都不生效,可以直接卸载v4版本的Core Tools,安装匹配.NET Core 3.1的v3版本Core Tools,从根源避免运行时不兼容问题。
内容的提问来源于stack exchange,提问作者Michal B.
相关产品推荐
相关产品推荐

