You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core调用ExecuteSqlInterpolatedAsync插入PostgreSQL数据报错如何解决?

EF Core调用ExecuteSqlInterpolatedAsync插入PostgreSQL数据语法错误问题解决

问题根因

  • ExecuteSqlInterpolatedAsync的核心逻辑是将插值字符串中的每一个{}占位符自动映射为独立的SQL参数,不会对占位符内部的内容做SQL语法解析。你直接将整个元组q.First()作为单个插值项传入时,EF Core会把整个元组封装为单个参数$1,最终生成的SQL语句为INSERT into "LookupRows" ("Index", "RowData", "LookupId") VALUES $1,不符合PostgreSQL要求的VALUES (值1,值2,值3)语法规范,因此报语法错误。
  • ExecuteSqlRawAsync能执行成功的原因是你先调用了str.ToString(),C#在本地直接完成了字符串拼接,将元组的内容直接拼入SQL文本中,相当于执行的是完整的静态SQL,没有参数化转换的过程。但这种写法存在SQL注入风险,不推荐生产环境使用。

正确写法

将元组的三个字段拆分后分别作为独立的插值项传入即可:

// 先拆解元组的三个字段
var (index, rowData, lookupId) = q.First();
// 单独传入每个插值参数
await _context.Database.ExecuteSqlInterpolatedAsync(
    $"INSERT into \"LookupRows\" (\"Index\", \"RowData\", \"LookupId\") VALUES ({index}, {rowData}, {lookupId});",
    cancellationToken);

补充说明

这种写法既符合ExecuteSqlInterpolatedAsync的参数化设计要求,生成的SQL语法合法,也能避免SQL注入风险,是官方推荐的用法。

内容的提问来源于stack exchange,提问作者Stanislav Muryndin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:18:03