通过EF Core SqlQuery传递GUID触发PostgreSQL UUID格式错误求助
问题
我编写了调用PostgreSQL函数的代码,在pgAdmin中调用该函数可正常运行。我的C#代码如下:
_db.Database.SqlQuery<CreateOrderInfo>($"select * from Asset_CreateOrderInfo('{request.Data!.UserId}',{request.Data!.SymbolId})")
生成的命令如下:
select * from Asset_CreateOrderInfo('00000001-0000-0000-0000-000000000000',2)
该命令在pgAdmin中运行正常,但通过EF Core执行时触发错误:
Npgsql.PostgresException (0x80004005): 22P02: invalid input syntax for type uuid: "@p0"
问题原因分析
- 参数化逻辑冲突:直接用字符串拼接生成SQL时,EF Core会自动尝试对语句进行参数化处理,但你手动为UUID值添加了单引号,导致EF Core误将带引号的内容识别为参数占位符的一部分,最终把
@p0作为UUID值传入PostgreSQL,引发类型解析错误。 - 类型映射失效:PostgreSQL的UUID类型需要通过EF Core的类型映射机制正确传递参数,字符串拼接破坏了这一机制,无法将C#中的UUID类型正确转换为PostgreSQL的UUID类型,反而被当作普通字符串参数处理,导致语法不匹配。
- SQL写法不符合EF Core规范:这种直接拼接SQL的方式违背了EF Core推荐的参数化查询原则,不仅会引发类型问题,还存在SQL注入的安全风险。
内容的提问来源于stack exchange,提问作者Meysam Khoshbakht
相关产品推荐
相关产品推荐

