FromSqlRaw()相关官方文档是否存在内容表述矛盾的问题?
报错原因说明
该报错是因为混淆了FromSqlRaw支持的两种参数传递语法:
{}包裹的语法仅支持数字序数占位符(比如{0}、{1}),用来按顺序匹配后续传入的参数列表,不可直接包裹命名参数名。写法{@MyParameter}会被EF Core尝试解析为数字索引,解析失败就会触发FormatException: Input string was not in a correct format报错。- 命名参数模式下,直接在SQL语句中写
@参数名即可,不需要额外加{}包裹,这符合原生SQL的参数传递习惯,也就是第二个可正常执行的写法逻辑。
相关文档不存在内容错误,对应两种不同的参数用法场景:文档中展示的带{}的示例,均为序数参数的用法,比如FromSqlRaw("SELECT * FROM Blogs WHERE Id = {0}", id),其中{0}对应传入的第一个参数,和命名参数的使用场景完全不同。
两种合法的
FromSqlRaw参数写法示例 1. 序数占位符写法(无需手动构造SqlParameter)
// {0}对应第一个传入的参数,EF Core会自动处理参数化逻辑避免注入风险 Context.Entity.FromSqlRaw("SELECT * FROM dbo.SomeFunction({0})", "some value")
2. 命名参数写法(手动构造SqlParameter)
// 命名参数直接写@前缀的参数名即可,无需加{}包裹 Context.Entity.FromSqlRaw("SELECT * FROM dbo.SomeFunction(@MyParameter)", new SqlParameter("@MyParameter", "some value"))
内容的提问来源于stack exchange,提问作者Grimm
相关产品推荐
相关产品推荐

