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

EF7连接Oracle数据库时出现InvalidCastException异常求助

问题分析:Oracle EF Core 查询时 InvalidCastException 异常

问题背景

  • 环境:.NET 7,采用数据库优先方式生成EF Core模型上下文,对接Oracle数据库
  • 异常触发:执行LINQ查询时抛出InvalidCastException,堆栈信息显示异常源于Oracle.ManagedDataAccess.Client.OracleDataReader.GetInt16(int i)
  • 关键现象:注释Car类中对应数据库VARCHAR2(6 BYTE)类型的Owner属性后,查询可正常执行
  • 依赖包:Oracle.EntityFrameworkCore 7.21.8、Microsoft.EntityFrameworkCore.Design 7.0.1
  • 初步排查:已排除列可空问题,怀疑数据或模型映射存在异常

执行的LINQ查询

return await _context.Cars.Take(10).ToListAsync();

完整堆栈跟踪

System.InvalidCastException: Specified cast is not valid.
   at Oracle.ManagedDataAccess.Client.OracleDataReader.GetInt16(Int32 i)
   at lambda_method19(Closure, QueryContext, DbDataReader, ResultContext, SingleQueryResultCoordinator)
   at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()
   at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken)
   at CarService.Controllers.CarController.GetCars(Int32 plate) in C:\GIT\webservices\car-service-dotnet\CarService\Controllers\CarController.cs:line 45
   at lambda_method5(Closure, Object)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)

问题原因

  1. 模型类型映射错误:数据库优先生成模型时,EF Core错误将VARCHAR2(6 BYTE)类型的Owner列映射为short(Int16)类型,而非正确的string类型。这导致OracleDataReader尝试把字符串数据强制转换为Int16,触发类型转换异常。
  2. 版本兼容性问题:Oracle.EntityFrameworkCore 7.21.8与Microsoft.EntityFrameworkCore.Design 7.0.1版本不匹配,反向生成模型时类型映射逻辑出错。
  3. 异常数据干扰:若模型映射本身正确,可能是数据库中Owner列存在不符合VARCHAR2(6 BYTE)定义的异常数据(如无法解析为字符串的二进制内容),但结合堆栈指向GetInt16,此可能性低于映射错误。

解决建议

  • 手动修正Car类中Owner属性的类型为string,并确认上下文配置保持HasMaxLength(6)、IsUnicode(false)
  • 统一EF Core相关包版本,确保Oracle.EntityFrameworkCore与Microsoft.EntityFrameworkCore系列包版本一致
  • 验证数据库中Owner列的实际数据,排查是否存在异常内容

内容的提问来源于stack exchange,提问作者malle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:55:27