WPF Core 6.0三层项目执行Add-Migration报错:无法创建FactoryDbContext对象
解决WPF Core 6.0中EF Core迁移无法创建DbContext的问题
问题原因
EF Core执行Add-Migration等设计时命令时,不会触发WPF应用的App启动逻辑,因此无法通过你在ConfigureServices中配置的依赖注入容器获取FactoryDbContext实例,导致报错。
解决方案
方案1:实现设计时DbContext工厂(推荐)
在FactoryDbContext所在的项目中创建一个实现IDesignTimeDbContextFactory<FactoryDbContext>的类,让EF Core在设计时通过这个工厂创建上下文实例:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; public class FactoryDbContextFactory : IDesignTimeDbContextFactory<FactoryDbContext> { public FactoryDbContext CreateDbContext(string[] args) { var optionsBuilder = new DbContextOptionsBuilder<FactoryDbContext>(); // 替换为你的SQL Server连接字符串,也可以从配置文件读取(比如appsettings.json) optionsBuilder.UseSqlServer("Server=.;Database=FactoryDB;Trusted_Connection=True;TrustServerCertificate=True;"); return new FactoryDbContext(optionsBuilder.Options); } }
方案2:添加无参构造函数(临时测试用)
在FactoryDbContext中添加无参构造函数,内部直接配置连接字符串(不推荐生产环境使用,因为硬编码连接字符串不利于维护):
public class FactoryDbContext : DbContext { public FactoryDbContext(DbContextOptions<FactoryDbContext> options) : base(options) { } // 添加无参构造函数 public FactoryDbContext() : base(GetDefaultOptions()) { } private static DbContextOptions<FactoryDbContext> GetDefaultOptions() { var optionsBuilder = new DbContextOptionsBuilder<FactoryDbContext>(); optionsBuilder.UseSqlServer("Server=.;Database=FactoryDB;Trusted_Connection=True;TrustServerCertificate=True;"); return optionsBuilder.Options; } // ... 你的DbSet定义 }
方案3:指定迁移命令的项目
如果你的FactoryDbContext在类库项目,而启动项目是WPF项目,执行迁移时需要明确指定启动项目和数据项目:
在Package Manager Console中执行:
Add-Migration InitialCreate -StartupProject 你的WPF项目名称 -Project 你的数据类库项目名称
或者先将Package Manager Console的「默认项目」设置为数据类库项目,确保启动项目选择WPF项目。
内容的提问来源于stack exchange,提问作者Дмитрий Кеменов
相关产品推荐
相关产品推荐

