.NET Core 3.1 EF迁移报错:无法创建AppDbContext实例
搞定EF Core迁移时创建AppDbContext失败的问题
看你贴的堆栈跟踪,核心是两个问题在搞鬼:
- 启动时触发了空引用异常(
NullReferenceException),导致EF Core没法正常访问宿主服务 - EF Core在设计时找不到
AppDbContext的无参构造函数,没法创建实例
咱们一步步来解决:
第一步:先把启动时的空引用问题解决
你的ConfigureServices里直接调用了_scheduler.Clear();,但这时候_scheduler大概率还没被初始化,就像拿一个还没装水的杯子倒水,肯定会出问题。
把这行代码移到Configure方法里就好,因为Configure是在所有服务都配置完成后才执行的,这时候_scheduler已经被正确注入了:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 先保留你原来的中间件配置代码,比如UseStaticFiles、UseRouting这些 // 把这行移到这里 _scheduler.Clear(); }
第二步:给EF Core设计时创建DbContext开个“绿色通道”
EF Core执行迁移这类设计时操作时,需要能创建DbContext实例,这里有两种靠谱的方式:
方式一:临时加个无参构造(简单但不够灵活)
直接在AppDbContext里加个无参构造函数,内部可以用默认配置(比如指向你开发环境的连接字符串):
// 新增无参构造,给设计时用 public AppDbContext() : base() { } // 保留你原来的带参数构造,给运行时用 public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
不过这种方式硬编码配置不太灵活,更推荐下面的方式。
方式二:实现设计时DbContext工厂(推荐)
创建一个专门的工厂类,让EF Core在设计时通过这个工厂来创建DbContext,完全不依赖宿主服务,还能复用你的配置文件:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; using System.IO; namespace DatabaseContext { public class AppDbContextFactory : IDesignTimeDbContextFactory<AppDbContext> { public AppDbContext CreateDbContext(string[] args) { // 加载项目的appsettings.json配置,和运行时保持一致 var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); var options = new DbContextOptionsBuilder<AppDbContext>(); options.UseSqlServer(config.GetConnectionString("AutoLoverDbConnection"), x => x.MigrationsAssembly("AutoMatcherProject")); return new AppDbContext(options.Options); } } }
把这个类放在和AppDbContext同一个项目里就行,EF Core会自动找到它。
第三步:重新执行迁移命令
先确保之前的迁移文件夹已经删掉,数据库也彻底删除了,然后重新跑:
Add-Migration "你的迁移名称" -Verbose
为啥旧项目没问题?
旧项目是netcoreapp3.0,对应的EF Core 3.0在设计时的服务查找逻辑和3.1有差异,而且旧项目里可能没有_scheduler.Clear()这种提前调用未初始化对象的代码,所以没触发空引用异常,EF Core能正常通过宿主服务拿到DbContext实例。
内容的提问来源于stack exchange,提问作者Roman Sterlin
相关产品推荐
相关产品推荐

