EF Core 5.0使用FromSqlRaw访问MySQL抛出SQL语法异常问题
问题结论
该异常不是Guid与binary(16)类型不匹配导致的,问题出在你编写的原生SQL语句本身存在语法错误。
错误原因
查看你提供的执行代码,SQL语句存在两处明显语法问题:
- 表名与查询条件之间缺少
WHERE关键字 - SQL语句末尾多写了一个多余的右括号
)
// 错误写法 this.DbContext.Set<TEntity>().FromSqlRaw(@"select * from <TableName> Id = {0};)", Id).ToList() // 问题位置:表名后缺WHERE,末尾多了)
MySQL解析器执行SQL时,读到表名后没有识别到合法的后续语法,直接遇到Id = ...片段,所以抛出1064语法错误,错误提示的语法位置和你的代码问题完全匹配。
补充说明:Pomelo连接器默认就会将C#的Guid类型映射为MySQL的binary(16)类型,参数化传入Guid时自动生成带_binary前缀的二进制参数,这个转换逻辑本身是合规的,不存在类型不匹配问题。
修复方案
修正SQL的语法错误即可:
// 正确写法,加上WHERE,去掉多余右括号 this.DbContext.Set<TEntity>().FromSqlRaw(@"select * from <TableName> WHERE Id = {0};", Id).ToList()
若修改后仍有异常,可额外排查两个点:
- 确认表名、Id字段名拼写正确,如果是MySQL保留关键字需要用反引号包裹
- 确认传入的Id参数为Guid类型,不存在类型传错的问题
内容的提问来源于stack exchange,提问作者Rafabd
相关产品推荐
相关产品推荐

