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)
问题原因
- 模型类型映射错误:数据库优先生成模型时,EF Core错误将
VARCHAR2(6 BYTE)类型的Owner列映射为short(Int16)类型,而非正确的string类型。这导致OracleDataReader尝试把字符串数据强制转换为Int16,触发类型转换异常。 - 版本兼容性问题:Oracle.EntityFrameworkCore 7.21.8与Microsoft.EntityFrameworkCore.Design 7.0.1版本不匹配,反向生成模型时类型映射逻辑出错。
- 异常数据干扰:若模型映射本身正确,可能是数据库中
Owner列存在不符合VARCHAR2(6 BYTE)定义的异常数据(如无法解析为字符串的二进制内容),但结合堆栈指向GetInt16,此可能性低于映射错误。
解决建议
- 手动修正
Car类中Owner属性的类型为string,并确认上下文配置保持HasMaxLength(6)、IsUnicode(false) - 统一EF Core相关包版本,确保Oracle.EntityFrameworkCore与Microsoft.EntityFrameworkCore系列包版本一致
- 验证数据库中
Owner列的实际数据,排查是否存在异常内容
内容的提问来源于stack exchange,提问作者malle
相关产品推荐
相关产品推荐

