.NET 6/EF Core:能否移除迁移项目中的额外上下文工厂?
解决.NET 6 EF迁移中移除Migrations项目ContextFactory的问题
要统一DbContext配置、移除Migrations项目里仅用于迁移的ContextFactory,同时避免迁移命令报错,按以下步骤操作:
1. 确认项目结构与依赖
确保你的DbContext类和所有迁移类都在Migrations项目中,Api项目已正确引用Migrations项目。Api项目里的services.AddDbContextFactory配置要保留(这是唯一的DbContext配置入口)。
2. 执行迁移命令时指定启动项目与迁移程序集
移除Migrations项目的ContextFactory后,EF迁移命令需要明确知道从哪里加载DbContext配置(Api项目),以及往哪个项目生成迁移文件(Migrations项目)。执行命令时加上这两个参数:
dotnet ef migrations add [你的迁移名称] --startup-project ../[Api项目文件夹名] --project ../[Migrations项目文件夹名] --context [你的DbContext类名]
比如你的Api项目叫MyApi,Migrations项目叫MyMigrations,DbContext叫AppDbContext,命令就是:
dotnet ef migrations add AddUserTable --startup-project ../MyApi --project ../MyMigrations --context AppDbContext
3. 可选:简化命令(显式指定迁移程序集)
不想每次命令都加一堆参数?可以在Api项目的DbContext配置里,直接指定迁移程序集,这样EF就知道要把迁移文件生成到哪里:
services.AddDbContextFactory<AppDbContext>(options => options.UseSqlite("你的连接字符串") .UseMigrationsAssembly("MyMigrations")); // 这里填Migrations项目的程序集名称
或者在DbContext的OnConfiguring方法里加:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { optionsBuilder.UseSqlite("你的连接字符串") .UseMigrationsAssembly("MyMigrations"); } }
之后执行迁移命令就只需要指定启动项目了:
dotnet ef migrations add AddUserTable --startup-project ../MyApi
4. 验证数据库更新
更新数据库时同样要指定启动项目,确保用的是Api项目里的配置:
dotnet ef database update --startup-project ../MyApi
排查报错
如果还是出现“目标项目与迁移程序集不匹配”的错误,检查这几点:
- Api项目是否真的引用了Migrations项目
UseMigrationsAssembly里填的程序集名称是否和Migrations项目的输出程序集名一致- 命令里的相对路径是否正确(比如你当前在Migrations项目目录下,
../MyApi才是正确的Api项目路径)
内容的提问来源于stack exchange,提问作者Ingmar
相关产品推荐
相关产品推荐

