使用EF Core ExecuteSqlRawAsync存储JSON字符串时出现格式错误的问题咨询
解决EF Core 3.1 ExecuteSqlRawAsync存储JSON字符串时的格式错误问题
你遇到的这个错误,核心原因是EF Core的ExecuteSqlRawAsync会把SQL语句里的{}当成参数占位符来解析,而你JSON字符串里的{"property1":"value1"...}刚好包含单个花括号,EF会误以为这是参数标记,从而抛出格式错误——虽然直接在SQL Server里执行没问题,但EF的SQL解析逻辑会优先处理这些花括号。
下面给你两种可行的解决方案:
方案一:转义JSON中的花括号
把JSON里的每个{替换成{{,每个}替换成}},这样EF会将其解析为普通的花括号,而不是参数占位符。修改后的代码如下:
string query = "update mytable set column1 = 100, column2= '[{{\"property1\":\"value1\",\"property2\":null}}]' where condition;update mytable set column1= 200, column2= '[{{\"property1\":\"value2\",\"property\":null}}]' where condition;" await this.Context.Database.ExecuteSqlRawAsync(query);
EF Core会自动把{{转译为{,}}转译为},最终发送到数据库的SQL就是你原本期望的正确JSON格式。
方案二:使用参数化查询(推荐)
直接拼接SQL字符串不仅容易遇到解析问题,还存在SQL注入风险。更规范的做法是把JSON字符串作为参数传入,示例代码如下:
// 定义要存储的JSON字符串 var jsonValue1 = "[{\"property1\":\"value1\",\"property2\":null}]"; var jsonValue2 = "[{\"property1\":\"value2\",\"property\":null}]"; // 编写带参数占位符的SQL语句 string query = @" update mytable set column1 = 100, column2 = @JsonVal1 where condition; update mytable set column1 = 200, column2 = @JsonVal2 where condition;"; // 传入参数执行查询 await this.Context.Database.ExecuteSqlRawAsync(query, new SqlParameter("@JsonVal1", jsonValue1), new SqlParameter("@JsonVal2", jsonValue2));
这种方法既规避了EF对花括号的解析问题,又能有效防止SQL注入,尤其适合JSON内容来自外部输入的场景。
补充说明:EF Core 3.1的RawSql系列方法(包括ExecuteSqlRawAsync)确实会对单花括号做特殊处理,用来支持索引式参数(比如{0}、{1}),所以直接包含单花括号的字符串会触发解析错误,通过转义或参数化就能完美解决这个问题。
内容的提问来源于stack exchange,提问作者Vikash Mishra
相关产品推荐
相关产品推荐

