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
相关产品推荐
相关产品推荐

