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

.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.EntityFrameworkCore
    • Microsoft.EntityFrameworkCore.Relational
    • MySql.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:07:19