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

互相引用的.NET项目能否使用不同版本的EF Core?

解决方案与说明

1. 能否混用不同版本的EF Core?

可以,但必须严格隔离不同版本的EF Core依赖,避免运行时程序集冲突。你遇到的错误本质是程序集加载的版本劫持问题:.NET 6 API项目优先加载了Pomelo 6.x版本,而MyProject.Data编译时依赖的是Pomelo 3.x中的MySqlDbContextOptionsExtensions,但运行时却尝试从Pomelo 6.x中查找该类型——Pomelo 6.x已将该类型移至Pomelo.EntityFrameworkCore.MySql命名空间,不再属于Microsoft.EntityFrameworkCore,因此导致类型找不到。

2. 具体修复步骤

(1)调整MyProjectContext构造方式

移除MyProjectContext中硬编码的EF配置逻辑,改为通过依赖注入传入DbContextOptions<MyProjectContext>,让调用方明确指定配置版本:

// MyProject.Data中的MyProjectContext修改为:
public class MyProjectContext : DbContext
{
    public MyProjectContext(DbContextOptions<MyProjectContext> options) : base(options)
    {
    }

    // 删除原默认构造函数和GetMySQLContextOptions方法
}

(2)在.NET 6 API中单独配置MyProjectContext

在Autofac模块或原生DI中,为MyProjectContext明确指定Pomelo 3.x的配置,与OAuthDbContext的EF 6.x配置隔离:

// 在API项目的Autofac模块中注册MyProjectContext:
containerBuilder.Register<MyProjectContext>(c =>
{
    var optionsBuilder = new DbContextOptionsBuilder<MyProjectContext>();
    // 明确使用Pomelo 3.x的UseMySql扩展方法
    optionsBuilder.UseMySql("你的数据库连接字符串", ServerVersion.AutoDetect("你的数据库连接字符串"));
    return new MyProjectContext(optionsBuilder.Options);
}).InstancePerLifetimeScope();

(3)添加程序集绑定重定向(可选)

在.NET 6 API项目的runtimeconfig.template.json中添加绑定规则,确保MyProject.Data加载正确版本的Pomelo程序集:

{
  "dependencies": {
    "Pomelo.EntityFrameworkCore.MySql": {
      "version": "3.2.7"
    }
  }
}

(4)长期方案:逐步统一EF Core版本

短期隔离版本可以解决问题,但长期建议将所有项目的EF Core版本统一到6.x(.NET Standard 2.0兼容EF Core 6.x):

  • 升级MyProject.Data的EF Core和Pomelo版本到6.x
  • 重新生成数据库迁移(注意备份数据并验证脚本)
  • 同步升级其他依赖该类库的项目(如.NET Core 5.0控制台应用可升级至.NET 6)

内容的提问来源于stack exchange,提问作者Adrian Wright

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:40:31