.NET从v2升级到v8后出现System.MissingMethodException错误求助
解决.NET 8升级后EF Core调用存储过程出现的MissingMethodException问题
问题概述
将后端从.NET 2升级到.NET 8后,前端登录时调用存储过程的方法抛出以下错误:
System.MissingMethodException: 'Method not found: 'Void CoreTypeMappingParameters..ctor(System.Type, Microsoft.EntityFrameworkCore.Storage.ValueConversion.ValueConverter, Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer, Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer, Microsoft.EntityFrameworkCore.ChangeTracking.ValueComparer, System.Func`3<Microsoft.EntityFrameworkCore.Metadata.IProperty,Microsoft.EntityFrameworkCore.Metadata.IEntityType,Microsoft.EntityFrameworkCore.ValueGeneration.ValueGenerator>)'.'
错误触发在登录验证方法的存储过程调用处:
public LoginResponce ValidateUserLogin(LoginRequest loginRequest) { MySqlParameter[] sqlParams = new MySqlParameter[1]; sqlParams[0] = new MySqlParameter { ParameterName = "loginId", MySqlDbType = MySqlDbType.VarChar, Value = loginRequest.UserId.StringVal() }; return Context.LoginResponces.FromSqlRaw<LoginResponce>("Call ValidateUserLogin (@loginId)", sqlParams).FirstOrDefault(); }
数据库配置代码:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.ConfigureWarnings(warnings => warnings.Log(CoreEventId.LazyLoadOnDisposedContextWarning)); if (optionsBuilder.IsConfigured == false) { optionsBuilder.UseMySql(EntityConstants.SQLConnectionString, new MySqlServerVersion(new Version(8, 0, 33))) .UseLazyLoadingProxies(false) .EnableSensitiveDataLogging() .EnableDetailedErrors(); } }
解决方案
1. 统一EF Core相关NuGet包版本
这个错误的核心原因是EF Core及其MySQL提供程序的版本不匹配,.NET 8要求所有EF Core相关包版本统一为8.x.x:
- 打开NuGet包管理器,检查以下包的版本:
Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.RelationalMySql.EntityFrameworkCore(或Pomelo.EntityFrameworkCore.MySql)
- 将所有上述包升级到适配.NET 8的最新稳定版本(例如8.0.x),确保版本完全一致,避免混合不同版本的依赖。
- 移除任何针对.NET 2的旧版EF Core相关包(如版本低于6.x的无关包)。
2. 修正存储过程调用方式
- 确认
LoginResponces已在DbContext中正确注册为DbSet<LoginResponce>:
如果未注册,可替换调用代码为public DbSet<LoginResponce> LoginResponces { get; set; }Context.Set<LoginResponce>().FromSqlRaw(...):return Context.Set<LoginResponce>().FromSqlRaw("Call ValidateUserLogin (@loginId)", sqlParams).FirstOrDefault(); - 检查MySQL参数格式:确保存储过程中的参数名与代码中的
loginId一致,EF Core中MySQL参数使用@前缀兼容,若出现参数不匹配问题,可尝试改用?前缀(需与参数顺序对应)。
3. 清理项目依赖并重新生成
- 删除项目目录下的
bin和obj文件夹,清除编译缓存。 - 执行
dotnet clean和dotnet restore命令,重新还原NuGet包。 - 重新生成整个解决方案,确保所有依赖都正确加载。
4. 替换MySQL EF Core提供程序(可选)
如果使用Oracle官方的MySql.EntityFrameworkCore仍存在兼容性问题,建议替换为社区维护的Pomelo.EntityFrameworkCore.MySql,它对.NET 8的支持更完善:
- 卸载
MySql.EntityFrameworkCore,安装Pomelo.EntityFrameworkCore.MySql(版本选择8.x.x)。 - 调整DbContext配置代码中的
UseMySql方法(参数格式一致,无需大幅修改)。
内容的提问来源于stack exchange,提问作者Abhishek Negi
相关产品推荐
相关产品推荐

