如何修复Oracle.EntityFrameworkCore中get_Info方法无实现的TypeLoadException错误
这个错误我之前帮不少开发者排查过,核心问题就是Oracle.EntityFrameworkCore包与Microsoft.EntityFrameworkCore主包的版本不兼容。你看到的get_Info方法未实现的报错,本质是版本不匹配导致的接口契约不一致。
为什么会出现这个问题?
Oracle的EF Core Provider对版本匹配要求非常严格:不同大版本的EF Core(比如2.x、3.x、6.x)对应着特定版本的Oracle.EntityFrameworkCore。你当前使用的Oracle.EntityFrameworkCore, Version=2.0.19.1属于2.x系列,但如果你的项目里引用的Microsoft.EntityFrameworkCore是更高版本(比如3.x及以上),就会出现这种方法找不到的兼容性问题——因为高版本的EF Core对扩展接口做了修改,而旧版本的Oracle Provider没有实现这些新接口方法。
一步一步解决
1. 检查并对齐版本
打开你的项目文件(.csproj),查看所有Microsoft.EntityFrameworkCore相关包(比如Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.Design等)的版本号,确保它们和Oracle.EntityFrameworkCore属于同一大版本:
- Oracle EF Core 2.x → 对应Microsoft EF Core 2.x(2.0~2.2)
- Oracle EF Core 3.x → 对应Microsoft EF Core 3.x
- Oracle EF Core 6.x+ → 对应相同大版本的Microsoft EF Core
2. 重新安装匹配的NuGet包
先卸载不兼容的包,再安装对应版本:
# 卸载现有包 Uninstall-Package Microsoft.EntityFrameworkCore Uninstall-Package Microsoft.EntityFrameworkCore.Design Uninstall-Package Oracle.EntityFrameworkCore # 安装匹配的版本(以2.2为例,你可以根据需求调整) Install-Package Microsoft.EntityFrameworkCore -Version 2.2.6 Install-Package Microsoft.EntityFrameworkCore.Design -Version 2.2.6 Install-Package Oracle.EntityFrameworkCore -Version 2.2.0
3. 验证连接字符串格式
确保你的Oracle连接字符串格式正确,标准的TCP连接字符串示例:
optionsBuilder.UseOracle(@"User Id=your-user;Password=your-pass;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=your-oracle-host)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=your-service-name)))");
如果使用TNS别名,需要确保Oracle客户端的tnsnames.ora配置正确,但先优先解决版本问题,再排查连接字符串。
修正后的代码参考
你的实体类和DbContext代码本身没有问题,版本匹配后就能正常运行:
public class Template { public int Id { get; set; } public string Info { get; set; } } class TemplateContext : DbContext { public DbSet<Template> Templates { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseOracle(@"User Id=user;Password=pass;Data Source=your-valid-data-source"); } }
内容的提问来源于stack exchange,提问作者whoami

