.NET Core 2.1升级至6后用Devart执行存储过程报MissingMethodException错误
问题描述
我将应用程序的SDK和依赖项从.NET Core 2.1升级到了.NET Core 6,但在运行数据库存储过程时遇到了问题。我用于执行存储过程的代码如下:
public int ExecuteProcedure(string procedure, params object[] parameters) { List<OracleParameter> oracleParameterList = ((List<OracleParameter>)parameters[0]); string[] oracleParameters = new string[oracleParameterList.Count]; string query = "BEGIN " + procedure + "("; for (int i = 0; i < oracleParameterList.Count; i++) { OracleParameter parameter = oracleParameterList[i] as OracleParameter; oracleParameters[i] = ":" + parameter.ParameterName; } query += string.Join(",", oracleParameters); query += "); end;"; return Database.ExecuteSqlRaw(query, oracleParameterList); }
报错代码行为Database.ExecuteSqlRaw(query, oracleParameterList);,我使用Devart ORM进行数据库连接。
错误信息
System.MissingMethodException HResult=0x80131513 Message=Method not found: 'Int64 RelationalExtensionInfo.GetServiceProviderHashCode()'. Source=Devart.Data.Oracle.Entity.EFCore StackTrace: at Devart.Common.Entity.EntityOptionsExtension.get_Info() at Microsoft.EntityFrameworkCore.DbContextOptions.GetHashCode() at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd[TArg](TKey key, Func`3 valueFactory, TArg factoryArgument) at Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.GetOrAdd(IDbContextOptions options, Boolean providerRequired) at Microsoft.EntityFrameworkCore.DbContext.get_ContextServices() at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider() at Microsoft.EntityFrameworkCore.DbContext.Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure<System.IServiceProvider>.get_Instance() at Microsoft.EntityFrameworkCore.Infrastructure.Internal.InfrastructureExtensions.GetService[TService](IInfrastructure`1 accessor) at Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService[TService](IInfrastructure`1 accessor) at Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade.get_Dependencies() at Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade.Microsoft.EntityFrameworkCore.Storage.IDatabaseFacadeDependenciesAccessor.get_Dependencies() at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.GetFacadeDependencies(DatabaseFacade databaseFacade) at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.ExecuteSqlRaw(DatabaseFacade databaseFacade, String sql, IEnumerable`1 parameters) at IFFCO.HRMS.Entities.Models.ModelContext.ExecuteProcedure(String procedure, Object[] parameters) in C:\Users\110393\Desktop\update SDK 6\trunk\IFFCO.HRMS.Entities\Models\ModelContext.cs:line 648 at IFFCO.HRMS.Service.AccountService.ValidateUser(LoginModel loginModel) in C:\Users\110393\Desktop\update SDK 6\trunk\IFFCO.HRMS.Service\AccountService.cs:line 60 at IFFCO.HRMS.Web.Controllers.AccountController.Login(LoginViewModel loginViewModel) in C:\Users\110393\Desktop\update SDK 6\trunk\IFFCO.HRMS.Web\Controllers\AccountController.cs:line 73
问题原因
该报错是Devart Oracle EF Core驱动版本与EF Core 6版本不兼容导致的:
- .NET Core 2.1对应使用EF Core 2.x版本,你之前安装的Devart驱动为适配EF Core 2.x的版本,内部依赖EF Core 2.x的底层API
- 升级到.NET 6后,EF Core同步升级到6.x版本,微软在EF Core 3.x及后续版本中调整了
RelationalExtensionInfo类的API实现,旧版Devart驱动依赖的GetServiceProviderHashCode()方法已被修改或移除,因此调用时抛出方法缺失异常。
修复方案
- 升级Devart Oracle EF Core驱动:将
Devart.Data.Oracle.Entity.EFCore包升级到适配EF Core 6的版本(大版本号≥9.14即可,注意所有Devart相关依赖包的版本要保持一致) - 统一EF Core官方包版本:确保项目中所有
Microsoft.EntityFrameworkCore开头的依赖包版本统一为6.x稳定版,禁止不同大版本的EF Core包混装 - 清理残留编译文件:升级依赖后删除项目的bin、obj文件夹,清理本地NuGet缓存后重新编译项目,避免旧版dll残留引发兼容问题
内容的提问来源于stack exchange,提问作者vwadhwa3
相关产品推荐
相关产品推荐

