首页 > 解决方案 > 实体框架随机 InvalidCastException - 类型字符串,需要 int64

问题描述

我们有随机用户在随机时间收到 InvalidCastException 错误。这是非常零星的。我们正在使用 Entity Framework Core v2.1.4。我们无法按需重现错误。有没有人见过这种情况,或者可以帮助诊断/修复?

读取属性“DataGrid.Id”的数据库值时发生异常。预期类型为“System.Int64”,但实际值为“System.String”类型。

这个函数在我们的应用程序中被调用了很多次,数据库中的 DataGrid.Id 数据类型是一个 bigint。这是我们的模型:

public class DataGrid : IRepositoryEntity<long>
{
    [Key]
    public long Id { get; set; }

    [MaxLength(50)]
    public string Name { get; set; }

    [ForeignKey("GridId")]
    public ICollection<DataGridColumn> Columns { get; set; }
}

这发生在这行代码上:

return await _entitySet.ToListAsync();

让我知道是否可以提供更多信息,这已完全记录在 graylog 中,因此我可以访问它。

堆栈跟踪非常大,但在这里:

在 Microsoft.EntityFrameworkCore.Metadata.Internal.EntityMaterializerSource.ThrowReadValueException[TValue](Exception exception, Object value, IPropertyBase property) at lambda_method(Closure, DbDataReader) at Microsoft.EntityFrameworkCore.Storage.Internal.TypedRelationalValueBufferFactory.Create(DbDataReader dataReader) at Microsoft .EntityFrameworkCore.Query.Internal.AsyncQueryingEnumerable 1.AsyncEnumerator.<BufferlessMoveNext>d__12.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at System.Runtime.CompilerServices.TaskAwaiter1.GetResult() 在 Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.d__7 2.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at System.Runtime.CompilerServices.TaskAwaiter1.GetResult() 在 Microsoft.EntityFrameworkCore.Query.Internal.AsyncQueryingEnumerable 1.AsyncEnumerator.<MoveNext>d__11.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable1.ConfiguredTaskAwaiter.GetResult() 在System.Linq.AsyncEnumerable.SelectEnumerableAsyncIterator 2.<MoveNextCore>d__7.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable1.ConfiguredTaskAwaiter.GetResult() 在 System.Linq.AsyncEnumerable.AsyncIterator1.<MoveNext>d__10.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at System.Runtime.CompilerServices.TaskAwaiter1.GetResult() 在 Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.ExceptionInterceptor 1.EnumeratorExceptionInterceptor.<MoveNext>d__5.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable1.ConfiguredTaskAwaiter.GetResult() 在 System.Linq.AsyncEnumerable.<Aggregate_>d__6 3.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at System.Runtime.CompilerServices.TaskAwaiter1.GetResult() 在 Quadax.RCM.Harp.Data.Repository .EntityFrameworkRepository2.<GetAllAsync>d__6.MoveNext() in C:\Bamboo\agent03\xml-data\build-dir\HARP-HDN-HDNWEB\src\Quadax.RCM.Harp.Data\Repository\EntityFrameworkRepository.cs:line 29 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at System.Runtime.CompilerServices.TaskAwaiter1.GetResult() 在 Quadax.RCM.Harp.Web.Features.DataGrid.GridConfigService.d__6.MoveNext() 在 C:\Bamboo\agent03\xml-data\build-dir\HARP-HDN-HDNWEB\src\Quadax .RCM.Harp.Web\Features\DataGrid\GridConfigService.cs:第 53 行 --- 在 System.Runtime 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 处从先前引发异常的位置结束堆栈跟踪.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at System.Runtime.CompilerServices.TaskAwaiter1.GetResult() at Quadax.RCM.Harp.Web.Features.DataGrid.DataGridController.<AllGridConfig>d__7.MoveNext() in C:\Bamboo\agent03\xml-data\build-dir\HARP-HDN-HDNWEB\src\Quadax.RCM.Harp.Web\Features\DataGrid\DataGridController.cs:line 52 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at System.Runtime.CompilerServices.TaskAwaiter1.GetResult() at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.TaskOfIActionResultExecutor.d__0.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪---在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter1.GetResult() at System.Threading.Tasks.ValueTaskMicrosoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__12.MoveNext() 处的 1.get_Result() --- 从先前引发异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__10.MoveNext() --- 堆栈结束从先前引发异常的位置跟踪 --- 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker 的 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context) 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()。 Next(State& next, Scope& scope, Object& state, Boolean&isCompleted) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__13.MoveNext() --- 从先前引发异常的位置结束堆栈跟踪---在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在系统。 Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__23.MoveNext() --- 上一个堆栈跟踪结束抛出异常的位置 --- 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context) 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State&) 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() next, Scope& 作用域, Object& 状态, Boolean&isCompleted) 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__18.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪--- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System. Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__16.MoveNext() --- 上一个堆栈跟踪结束引发异常的位置 --- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at Microsoft .AspNetCore.Routing.EndpointMiddleware.d__3。MoveNext() --- 从先前引发异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 System.Runtime 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.d__6.MoveNext() 处的 .CompilerServices.TaskAwaiter.ValidateEnd(Task task) --- 从先前引发异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo。 Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.d__6。MoveNext() --- 从先前引发异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 System.Runtime 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.d__7.MoveNext() 处的 .CompilerServices.TaskAwaiter.ValidateEnd(Task task) --- 从先前引发异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo。 Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) at Quadax.RCM.Harp.Web.Startup.SessionIdTracker.d__2.MoveNext() in C:\Bamboo\agent03\xml-data\build-dir\HARP-HDN-HDNWEB\src\Quadax.RCM.Harp.Web\Startup。cs:第 437 行 --- 从先前引发异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 处。 Microsoft.AspNetCore.Session.SessionMiddleware.d__9.MoveNext() 处的 Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) --- 从先前引发异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo Microsoft.AspNetCore.Session.SessionMiddleware.d__9.MoveNext() 处的 .Throw() --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 处从先前引发异常的位置结束堆栈跟踪。 System.Runtime 中的 Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)。Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.d__6.MoveNext() 处的 CompilerServices.TaskAwaiter.ValidateEnd(Task task)

标签: c#.netasp.net-coreentity-framework-core

解决方案


推荐阅读