当请求从具有重复字段的 protobuf 请求映射时,Npgsql 8.0 不再工作

问题描述 投票:0回答:1

使用 Npgsql 7.x 和 Dapper 的代码在 net 8 上工作正常。 它们在 Npgsql 8.0 中不起作用。

public class Location { public NpgsqlPoint Point { get; set; } }

public async Task<IEnumerable<Location>> GetLocationsAsync(DomainParams paramObject, CancellationToken cancellationToken)
using (NpgsqlConnection conn = new(_connectionString))
{
await conn.OpenAsync(cancellationToken);
return await conn.QueryAsync<Location>("select point from locationsTable where id = ANY(@ids)) ", new { paramObject.Ids } );
}    }

错误:

“深度”:0, “帮助URL”:空, “H结果”:-2147467262, "ClassName": "System.InvalidCastException", “远程堆栈索引”:0, “RemoteStackTraceString”:空, "StackTraceString": " at Npgsql.Internal.AdoSerializerHelpers.g__ThrowWritingNotSupported|1_0(类型类型,PgSerializerOptions 选项,可空 1 pgTypeId,可空 1 npgsqlDbType,异常内部) 在 Npgsql.Internal.AdoSerializerHelpers.GetTypeInfoForWriting(类型类型,可为空 1 pgTypeId,PgSerializerOptions 选项,可为空 1 npgsqlDbType) 在 Npgsql.NpgsqlParameter.ResolveTypeInfo(PgSerializerOptions 选项) 在 Npgsql.NpgsqlParameterCollection.ProcessParameters(PgSerializerOptions 选项,布尔值 validateValues,CommandType commandType) 在 Npgsql.NpgsqlCommand.ExecuteReader(布尔异步,CommandBehavior 行为,CancellationToken 取消令牌) 在 Npgsql.NpgsqlCommand.ExecuteReader(布尔异步,CommandBehavior 行为,CancellationToken 取消令牌) 在 Npgsql.NpgsqlCommand.ExecuteDbDataReaderAsync(CommandBehavior 行为,CancellationToken 取消令牌) 在 /_/Dapper/SqlMapper.Async.cs 中的 Dapper.SqlMapper.QueryAsync[T](IDbConnection cnn,类型 effectiveType,CommandDefinition 命令):第 434 行

后来编辑:我更新了标题/描述以匹配实际问题

.net dapper npgsql
1个回答
0
投票

问题出在 param 对象上,尽管它是从 protobuf 请求映射到父代码函数中的

var paramObject = new(){ Ids = protoReq.Ids }; 

现在在 net 8 上,仅当使用 Npgsql 8.0 时,它们仍然会以某种方式到达初始 protobuf 对象并给出此错误:

在 Npgsql.Internal.AdoSerializerHelpers.g__ThrowWritingNotSupported|1_0(类型类型,PgSerializerOptions 选项,可为空

1 pgTypeId, Nullable
1 npgsqlDbType,异常内部)//src/Npgsql/Internal/AdoSerializerHelpers.cs:第 58 行 在 /
/src/Npgsql/Internal/AdoSerializerHelpers.cs 中的 Npgsql.Internal.AdoSerializerHelpers.GetTypeInfoForWriting(类型类型,Nullable
1 pgTypeId, PgSerializerOptions options, Nullable
1 npgsqlDbType):第 46 行 在 //src/Npgsql/NpgsqlParameter.cs 中的 Npgsql.NpgsqlParameter.ResolveTypeInfo(PgSerializerOptions options):第 565 行 在 //src/Npgsql/NpgsqlParameterCollection.cs 中的 Npgsql.NpgsqlParameterCollection.ProcessParameters(PgSerializerOptions options,Boolean validateValues,CommandType commandType):第 739 行 在 //src/Npgsql/NpgsqlCommand.cs 中的 Npgsql.NpgsqlCommand.d__119.MoveNext() 处:第 1444 行 在 //src/Npgsql/NpgsqlCommand.cs 中的 Npgsql.NpgsqlCommand.d__119.MoveNext() 处:第 1596 行 在 //src/Npgsql/NpgsqlCommand.cs 中的 Npgsql.NpgsqlCommand.d__112.MoveNext() 处:第 1309 行 在 //Dapper/SqlMapper.Async.cs 中的 Dapper.SqlMapper.d__33`1.MoveNext() 处:第 434 行

修复方法是在映射中强制使用 Tolist(): var paramObject = new(){ Ids = protoReq.Ids.ToList() };

所以我仍然相信 NpgsqlParameter.ResolveTypeInfo 的 Npgsql 8.0 存在一些问题,因为代码在 net 8 和 Npgsql v 7.x 上工作得很好。

© www.soinside.com 2019 - 2024. All rights reserved.