.NET5中EF与WebAPI分属不同项目执行迁移脚本报错如何解决
报错原因
- EF Core 设计时工具运行迁移命令时,默认无法自动读取启动项目
GestionStock.API中配置的上下文注入规则与数据库连接信息 - 你的
GestionStockContext仅包含带参数的构造函数,设计时工具无法直接完成实例化,也未找到对应的设计时实例化工厂
解决方案
方案1:执行迁移命令时补充参数(无需修改代码)
如果你使用包管理器控制台运行命令:
- 先将控制台顶部的「默认项目」切换为
GestionStock.Infrastructure - 执行如下命令即可:
Add-Migration Initiale -StartupProject GestionStock.API
如果你使用dotnet CLI运行命令,在解决方案根目录执行:
dotnet ef migrations add Initiale --project GestionStock.Infrastructure --startup-project GestionStock.API
方案2:添加设计时上下文工厂(无需每次加参数)
在GestionStock.Infrastructure项目根目录添加GestionStockContextFactory.cs类,代码如下:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; using System.IO; public class GestionStockContextFactory : IDesignTimeDbContextFactory<GestionStockContext> { public GestionStockContext CreateDbContext(string[] args) { IConfigurationRoot configuration = new ConfigurationBuilder() // 若appsettings.json存放在API项目,可调整路径为:.SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../GestionStock.API")) .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); var optionsBuilder = new DbContextOptionsBuilder<GestionStockContext>(); optionsBuilder.UseSqlServer(configuration.GetConnectionString("Default"), opt => opt.MigrationsAssembly("GestionStock.Infrastructure")); return new GestionStockContext(optionsBuilder.Options); } }
添加完成后直接执行Add-Migration Initiale即可正常生成迁移。
注意事项
- 确保
GestionStock.API项目的appsettings.json中已正确配置名为Default的数据库连接字符串,且文件属性设置为「如果较新则复制」 - 两个项目安装的EF Core相关包版本需与.NET 5版本匹配,统一使用5.x版本
- 依赖包需确保已安装:
Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.SqlServer、Microsoft.EntityFrameworkCore.Tools
内容的提问来源于stack exchange,提问作者The lli
相关产品推荐
相关产品推荐

