【发布时间】:2022-01-13 18:24:38
【问题描述】:
错误:System.InvalidCastException:无法将“System.String”类型的对象转换为“System.Guid”类型。 在 Microsoft.Data.SqlClient.SqlBuffer.get_Guid() 在 Microsoft.Data.SqlClient.SqlDataReader.GetGuid(Int32 i) 在 lambda_method88(闭包,QueryContext,DbDataReader,ResultContext,SingleQueryResultCoordinator) 在 Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable
1.AsyncEnumerator.MoveNextAsync() at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable1 来源,CancellationToken cancelToken) 在 Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable1 source, CancellationToken cancellationToken) at AutoMapper.AspNet.OData.QueryableExtensions.GetAsync[TModel,TData](IQueryable1 查询,IMapper 映射器,Expression1 filter, Expression1 queryFunc,ICollection1 includeProperties, AsyncSettings asyncSettings) at AutoMapper.AspNet.OData.QueryableExtensions.GetAsync[TModel,TData](IQueryable1 查询,IMapper 映射器,ODataQueryOptions1 options, QuerySettings querySettings) at AutoMapper.AspNet.OData.QueryableExtensions.GetAsync[TModel,TData](IQueryable1 查询,IMapper 映射器,ODataQueryOptions1 options, HandleNullPropagationOption handleNullPropagation) at TRKAPI.Controllers.RecordsController.GetTaskRecord(ODataQueryOptions1 个选项)在
第 80 行被引用为原因
_context.TaskRecord.GetAsync(_mapper, options, HandleNullPropagationOption.Default);
在将表中的列从字符串更改为唯一标识符后开始发生这种情况。
- 我将数据传输到临时表。
- 我已从相关表格中删除。
- 我更改了列
- 正在运行
SELECT DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'TaskRecord'
AND COLUMN_NAME = 'TransactionId'
返回:
DATA_TYPE 唯一标识符
- 然后我从临时表中插入,将 transactionid 列转换为唯一标识符
- 从列中获取一个值并将其检查为有效的 guid 返回有效。
- 我更新了合同 (dto)、模型,并且在 db 上下文中没有对列的引用。
我不确定下一步该往哪里看,有什么想法?
【问题讨论】:
-
是否有任何非架构绑定视图?
-
您需要提供相关实体的代码(TaskRecord、本文提到的临时表等)以及您尝试执行的操作的实际代码。例如,如果您更改了表或实体中的基础类型而不是相应的位置,或者您进行了更改但尝试使用临时表中的 ExecuteSql() 之类的内容读取此更新的实体,并且临时表仍然具有varchar() 列,您可能会遇到这样的异常。这是没有看到实际代码的任何人的猜测。
-
@StevePy 有问题的代码实际上只是第 80 行。我在其他任何地方进行了所有更改(ef 模型和映射器使用的合同 (dto))引用了该列。临时表被删除,我只是使用临时表来操作原始表。从中读取的表是具有有效唯一标识符值的原始表,并设置为唯一标识符类型。我在 C# 中将所有相应的值从字符串更改为 Guid,并更新了表中的列。但它似乎没有以某种方式看到它......这就是为什么我很难过。
-
@DavidBrowne-Microsoft 这是一个基表。
-
好吧,DataReader 有一个字符串列,您正尝试将其作为 GUID 读取。
标签: c# sql .net entity-framework