.NET 8中EF Core脚手架执行时遇ReflectionTypeLoadException错误
问题描述
我正在构建Azure Function应用,尝试通过EF Core导入数据库上下文,执行了以下脚手架命令:
Scaffold-DbContext 'Data Source=XXXX;Initial Catalog=XXXX;Persist Security Info=False;User ID = XXXX; Password=XXXX;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout = 30;' Microsoft.EntityFrameworkCore.SqlServer -Context Context -OutputDir ContextModels -NoPluralize -Force
在Package Manager控制台运行该命令时,出现如下错误:
System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types.
Could not load type 'Microsoft.CodeAnalysis.AddImports.AbstractAddImportsService`4' from assembly 'Microsoft.CodeAnalysis.Workspaces, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.
Method 'AddReplacements' in type 'Microsoft.CodeAnalysis.VisualBasic.CaseCorrection.VisualBasicCaseCorrectionService' from assembly 'Microsoft.CodeAnalysis.VisualBasic.Workspaces, Version=3.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' does not have an implementation.
Method 'AddSyntacticClassifications' in type 'Microsoft.CodeAnalysis.VisualBasic.Classification.VisualBasicSyntaxClassificationService' from assembly 'Microsoft.CodeAnalysis.VisualBasic.Workspaces, Version=3.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' does not have an implementation.
Method 'AddLexicalClassifications' in type 'Microsoft.CodeAnalysis.VisualBasic.Classification.VisualBasicEditorClassificationService' from assembly 'Microsoft.CodeAnalysis.VisualBasic.Workspaces, Version=3.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' does not have an implementation.
Could not load type 'Microsoft.CodeAnalysis.CodeGeneration.AbstractImportsAdder' from assembly 'Microsoft.CodeAnalysis.Workspaces, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.
Could not load type 'Microsoft.CodeAnalysis.CodeGeneration.AbstractCodeGenerationService' from assembly 'Microsoft.CodeAnalysis.Workspaces, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.
Derived method 'ConditionalAccessExpression' in type 'Microsoft.CodeAnalysis.VisualBasic.CodeGeneration.VisualBasicSyntaxGenerator' from assembly 'Microsoft.CodeAnalysis.VisualBasic.Workspaces, Version=3.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' cannot reduce access.
错误内容还有更多,但受限于篇幅无法全部贴出。当前使用.NET 8及最新可用包,求解决方法。
解决方案
1. 统一CodeAnalysis相关包版本
错误核心是Microsoft.CodeAnalysis系列包版本不兼容:旧版(3.3.0.0)的VisualBasic.Workspaces与新版(4.5.0.0)的Workspaces冲突。
- 打开项目的
.csproj文件,检查所有Microsoft.CodeAnalysis.*相关的PackageReference,确保版本完全一致(建议使用.NET 8对应的最新稳定版,比如4.8.0或匹配EF Core 8的版本)。 - 如果存在不同版本的引用,统一修改为相同版本,然后执行
Update-Package -Reinstall重新安装包。
2. 清理并重建项目
- 在Package Manager控制台执行:
Clean-Solution Build-Solution - 删除项目目录下的
bin和obj文件夹,手动清理编译缓存。
3. 使用.NET CLI替代PM控制台
如果PM控制台仍有问题,尝试用.NET CLI执行脚手架命令:
dotnet ef dbcontext scaffold "Data Source=XXXX;Initial Catalog=XXXX;Persist Security Info=False;User ID = XXXX; Password=XXXX;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout = 30;" Microsoft.EntityFrameworkCore.SqlServer --context Context --output-dir ContextModels --no-pluralize --force
注意:确保已安装EF Core CLI工具,若未安装执行dotnet tool install --global dotnet-ef。
4. 检查Azure Function项目的SDK版本
确保Azure Function项目使用的是与.NET 8匹配的Microsoft.NET.Sdk.Functions版本(建议4.1.1或更高),避免SDK与EF Core包版本不兼容。
内容的提问来源于stack exchange,提问作者avsln

