使用EF创建迁移时无法实例化ApplicationDbContext的问题排查
EF Core迁移报错:无法创建ApplicationDbContext实例的解决办法
问题根源
执行dotnet ef migrations add命令时,EF Core的设计时工具不会自动启动Web应用的Program.cs,因此无法通过依赖注入容器获取DbContextOptions<ApplicationDbContext>,导致上下文实例创建失败。
解决方案:实现IDesignTimeDbContextFactory接口
通过创建设计时上下文工厂,让EF工具直接通过该工厂获取配置好的上下文实例,无需依赖Web应用的DI容器。
1. 创建上下文工厂类
在PMSX.Infrastructure.Persistence.Database命名空间下添加以下类:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; using System.IO; namespace PMSX.Infrastructure.Persistence.Database { public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext> { public ApplicationDbContext CreateDbContext(string[] args) { // 读取项目根目录的appsettings.json配置 var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); // 获取连接字符串 var connectionString = configuration.GetConnectionString("DefaultConnection"); // 配置DbContext选项 var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>(); optionsBuilder.UseSqlServer(connectionString, assembly => assembly.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName)); return new ApplicationDbContext(optionsBuilder.Options); } } }
2. 确保配置文件正确
检查Web项目根目录的appsettings.json,确认包含正确的连接字符串:
{ "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=PMSXDb;Trusted_Connection=True;MultipleActiveResultSets=true" } }
3. 修正Program.cs的连接字符串读取
在你的Program.cs片段中,补充连接字符串的读取逻辑,确保DI配置的正确性:
WebApplicationBuilder builder = WebApplication.CreateBuilder(args); IServiceCollection services = builder.Services; // 从配置中读取连接字符串 var sqlConnectionString = builder.Configuration.GetConnectionString("DefaultConnection"); services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(sqlConnectionString, assembly => assembly.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName))); services.AddDatabaseDeveloperPageExceptionFilter();
4. 执行迁移命令
确保终端当前工作目录为Web项目所在目录,执行迁移命令:
dotnet ef migrations add InitialCreate
如果上下文所在项目与启动项目分离,可通过--project参数指定上下文项目:
dotnet ef migrations add InitialCreate --project PMSX.Infrastructure.Persistence
内容的提问来源于stack exchange,提问作者HoboJeff
相关产品推荐
相关产品推荐

