You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:08:16