面向net6.0时EF Scaffold-DbContext报无设计时服务后抛NRE是什么原因?
问题原因
这个空引用异常(NRE)是.NET 6 预览版/RC1版本EF Core的已知问题,根因是EF Core设计时服务加载逻辑和.NET 6新增的配置、宿主初始化模式不兼容:当你使用Name=<连接字符串名称>语法从配置文件读取连接串时,NamedConnectionStringResolver无法正确获取到应用的服务提供器,读取配置的逻辑触发了空引用。
此外如果EF Core相关Nuget包、dotnet-ef工具、.NET SDK三者版本不匹配,也会触发该问题。
解决方法
你可以按以下优先级尝试修复:
- 首先统一所有相关组件版本:
Microsoft.EntityFrameworkCore.SqlServer、Microsoft.EntityFrameworkCore.Design、Microsoft.EntityFrameworkCore.Tools等所有EF Core依赖包的版本,必须和你安装的dotnet-ef工具版本、.NET SDK版本完全一致,禁止混合使用5.0和6.0版本的EF Core包。 - 临时替换连接串写法:不要使用
Name=<连接串名称>的语法,直接在Scaffold命令中传入完整的连接字符串,跳过设计时服务读取配置的步骤,即可直接规避该问题,示例命令如下:
Scaffold-DbContext "Server=你的数据库地址;Database=你的库名;UID=账号;PWD=密码;TrustServerCertificate=True" Microsoft.EntityFrameworkCore.SqlServer -Context MyDbContext -OutputDir ModelsNew -NoPluralize -Force -Verbose
- 如需保留命名连接串的用法,可手动添加设计时上下文工厂,在项目中新增以下类,让EF工具优先走你自定义的配置读取逻辑:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; using System.IO; public class DesignTimeMyDbContextFactory : IDesignTimeDbContextFactory<MyDbContext> { public MyDbContext CreateDbContext(string[] args) { IConfiguration configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>(); optionsBuilder.UseSqlServer(configuration.GetConnectionString("你的连接串名称")); return new MyDbContext(optionsBuilder.Options); } }
- 若你是在类库项目执行脚手架命令,需要在Package Manager Console中指定启动项目为带有
appsettings.json的入口项目,或者在命令中追加-StartupProject <你的入口项目名>参数,确保配置文件能被正确找到。
该问题在.NET 6正式版中已经被修复,升级到.NET 6正式版及以上版本也可直接解决。
内容的提问来源于stack exchange,提问作者CNHume
相关产品推荐
相关产品推荐

