EF Core生成DbContext迁移到外部程序集时出现循环依赖如何解决
解决步骤
1. 移除错误引用
直接删除MyProject.DbContext项目中对MyProject.DbContext.Migrations的引用,仅保留MyProject.DbContext.Migrations对MyProject.DbContext的单向引用即可,你之前添加该引用属于不必要的操作,也是循环依赖的根源。
MigrationsAssembly配置仅用于告知EF Core运行时从哪个程序集加载迁移文件,不需要MyProject.DbContext项目在编译期引用迁移程序集。
2. 调整dotnet ef命令参数
dotnet ef命令有两个核心参数需要明确区分:
--project:指定迁移文件生成的目标项目,即你的MyProject.DbContext.Migrations--startup-project:指定包含DbContext配置、可正常构建运行的项目,一般填你的主项目MyProject即可
调整后的命令示例:
# 可在解决方案根目录执行,也可根据你实际的目录结构调整相对路径 dotnet ef migrations add InitMySql --project MyProject.DbContext.Migrations --startup-project MyProject
3. 可选:添加设计时工厂(提升命令执行稳定性)
如果不想每次执行命令都依赖主项目,可在MyProject.DbContext项目中新增EF Core设计时工厂类,EF工具会自动识别该类创建DbContext实例:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; using System.IO; namespace MyProject.DbContext { public class MyDbContextDesignTimeFactory : IDesignTimeDbContextFactory<MyDbContext> { public MyDbContext CreateDbContext(string[] args) { IConfigurationRoot configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") // 可根据实际配置文件路径调整 .Build(); var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>(); optionsBuilder.UseMySql(configuration.GetConnectionString("DefaultConnection"), ServerVersion.AutoDetect(configuration.GetConnectionString("DefaultConnection")), b => { b.CommandTimeout(30); b.MigrationsAssembly("MyProject.DbContext.Migrations"); }); return new MyDbContext(optionsBuilder.Options); } } }
添加该类后,执行迁移命令时无需再指定--startup-project参数,仅需指定迁移输出项目即可。
运行时配置说明
最终主项目MyProject需要同时引用MyProject.DbContext和对应数据库的迁移项目MyProject.DbContext.Migrations,即可正常加载迁移文件完成数据库初始化操作,不会出现找不到迁移的问题。
内容的提问来源于stack exchange,提问作者Rey
相关产品推荐
相关产品推荐

