互相引用的.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
相关产品推荐
相关产品推荐

