Microsoft.Data.SqlClient.SqlBuffer 无法将“System.String”类型的对象转换为“System.Guid”类型

Posted

技术标签:

【中文标题】Microsoft.Data.SqlClient.SqlBuffer 无法将“System.String”类型的对象转换为“System.Guid”类型【英文标题】:Microsoft.Data.SqlClient.SqlBuffer Unable to cast object of type 'System.String' to type 'System.Guid' 【发布时间】: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.SingleQueryingEnumerable1.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 映射器,ODataQueryOptions 1 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 读取。 【参考方案1】:

好吧,我觉得自己很愚蠢。我有三个环境,在一个数据库中进行了更新,但 appsettings 设置为另一个。

无视。对不起。

【讨论】:

以上是关于Microsoft.Data.SqlClient.SqlBuffer 无法将“System.String”类型的对象转换为“System.Guid”类型的主要内容,如果未能解决你的问题,请参考以下文章

如何修复此错误:Microsoft.Data.SqlClient.SqlException (0x80131904): Invalid column name 'NormalizedEmail' 等

Microsoft.Data.SqlClient.SqlBuffer 无法将“System.String”类型的对象转换为“System.Guid”类型

这种情况一直在发生 - 在 Visual Studio 2019 中的 .NET Core 3.1 调试会话期间找不到 Microsoft.Data.SqlClient.resources.dll

实体框架核心:无效的列名“UserId1”

在 azure sql 上连接到数据库的问题

无法在剃刀页面表单的选择列表中保存多个选择