.NET Core控制台应用EF Core迁移报错:无法创建StudentContext的解决方法
解决.NET Core控制台EF Core执行
add-migration时的DbContext创建问题 这个问题我之前在控制台项目里用EF Core时也碰到过,核心原因是EF Core的设计时工具(比如add-migration)没办法像你的Program.cs那样在运行时读取配置来构建StudentContext实例。而你要求不能硬编码连接字符串,那最简单的方案就是实现IDesignTimeDbContextFactory<StudentContext>接口,具体操作如下:
步骤1:添加设计时DbContext工厂类
在你的项目中创建一个新类(比如DesignTimeStudentContextFactory.cs),放在任意可访问的目录下(比如和StudentContext同目录),代码如下:
using EFCore.Models; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; using System.IO; namespace EFCore.Models { public class DesignTimeStudentContextFactory : IDesignTimeDbContextFactory<StudentContext> { public StudentContext CreateDbContext(string[] args) { // 复用和Program里一致的配置读取逻辑,避免硬编码 var configBuilder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var configuration = configBuilder.Build(); var connectionString = configuration.GetConnectionString("Storage"); var optionsBuilder = new DbContextOptionsBuilder<StudentContext>() .UseSqlite(connectionString); return new StudentContext(optionsBuilder.Options); } } }
步骤2:重新执行迁移命令
添加完这个类之后,回到终端重新运行:
add-migration init
这时候EF Core工具就会自动找到这个工厂类,用它来创建StudentContext实例,读取appsettings.json里的连接字符串,顺利完成迁移创建。
为什么这个方案符合要求?
- 没有在
StudentContext里添加无参构造函数,也没有在OnConfiguring方法里硬编码连接字符串,保持了原有StudentContext的简洁性和依赖注入友好性 - 复用了和运行时一致的配置读取逻辑,确保设计时和运行时使用相同的连接字符串,避免配置不一致的问题
内容的提问来源于stack exchange,提问作者Display Name
相关产品推荐
相关产品推荐

