JsonApiDotNetCore中CommitAsync方法未实现异常排查求助
核心问题
你遇到的Unable to load one or more of the requested types. Method 'CommitAsync' in type 'JsonApiDotNetCore.Extensions.SafeTransactionProxy'...异常,本质是JsonApiDotNetCore与Entity Framework Core/ASP.NET Core的版本不兼容。
JsonApiDotNetCore 3.1.0版本的SafeTransactionProxy类在实现EF Core异步事务接口时,与你当前使用的EF Core版本中CommitAsync方法的签名不匹配,或者该版本的JsonApiDotNetCore存在实现缺失,导致运行时无法加载类型。
解决方案
统一框架版本
检查项目中ASP.NET Core、EF Core、JsonApiDotNetCore的NuGet包版本,确保三者大版本一致:- JsonApiDotNetCore 3.x系列对应ASP.NET Core 3.x + EF Core 3.x
- 如果使用ASP.NET Core 5+/EF Core 5+,需升级JsonApiDotNetCore到对应大版本(如5.x/6.x)
清理并重新安装依赖
- 删除项目目录下的
bin和obj文件夹 - 清理NuGet缓存:在终端执行
dotnet nuget locals all --clear - 重新安装所有NuGet包,确保无版本冲突残留
- 删除项目目录下的
验证事务接口匹配性
若坚持使用当前版本,可检查EF Core中IDbContextTransaction接口的CommitAsync方法签名,确认是否包含CancellationToken参数(JsonApiDotNetCore通常期望该参数存在)。
代码优化建议
1. 控制器规范调整
继承JsonApiController<T>后,无需自定义普通[HttpGet]方法,JsonApiDotNetCore已提供符合JSON:API规范的REST接口。若需扩展业务逻辑,建议通过重写ResourceService的方法实现,而非自定义Action。
2. EF Core存储过程调用优化
Service中手动管理SqlConnection的方式不符合EF Core最佳实践,可改用EF Core内置的存储过程调用:
// 先在AppDbContext中注册DbSet public DbSet<Pitch> Pitches { get; set; } // Service中的GetPitches方法简化为: public async Task<List<Pitch>> GetPitches() { return await _appDbContext.Pitches .FromSqlRaw("EXEC [PitchPower2].[uspGetPitches]") .ToListAsync(); }
3. Startup配置简化
ASP.NET Core 3.x中,配置可简化为:
public void ConfigureServices(IServiceCollection services) { services.AddDbContext<AppDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Connection"))); services.AddJsonApi<AppDbContext>(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseRouting(); app.UseJsonApi(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
内容的提问来源于stack exchange,提问作者TRK

