Fel*_*eza 2 c# resharper entity-framework-core
在我的VS 2017上安装Resharper后,我在SqlParameter参数上有这个警告.
格式字符串中不使用参数
var children = context.FluxoHierarchy
.FromSql("get_children_fluxo_closure @node_id", new SqlParameter("@node_id", queueItem.ProximoNode)).ToList();
Run Code Online (Sandbox Code Playgroud)
resharper向我提出的解决方案是删除多余的论点.
var children = context.FluxoHierarchy
.FromSql("get_children_fluxo_closure @node_id").ToList();
Run Code Online (Sandbox Code Playgroud)
我的代码有问题吗?
此警告的原因是FromSql您使用的重载是使用特殊的Resharper属性StringFormatMethodAttribute修饰的.这个属性
指示标记的方法通过格式模式和(可选)参数构建字符串.包含格式字符串的参数应在构造函数中给出.格式字符串应该在System.String.Format(System.IFormatProvider,System.String,System.Object [])中 - 就像表单一样.
因此,FromSql签名看起来像这样:
[StringFormatMethod("sql")]
public static IQueryable<TEntity> FromSql<TEntity>(this IQueryable<TEntity> source, RawSqlString sql, params object[] parameters)
Run Code Online (Sandbox Code Playgroud)
sql格式模式在哪里,并且parameters是格式字符串的参数,正如Resharper认为的那样,因为上面的属性.
然后ReSharper的看到你没有在你的格式字符串的任何位置参数(位置参数是一样{0},{1}等等-你会使用String.Format),并看到你传递一个参数.它正确(因为属性)认为这个参数是无用的,因为格式字符串不包含任何占位符.它希望你会像这样使用它(比如String.Format):
FromSql("get_children_fluxo_closure {0}", 1).ToList();
Run Code Online (Sandbox Code Playgroud)
这也是有效的用法(EF Core会将其转换1为参数并替换它,因此它不是SQL注入).
但是如您所知,这种方法支持另一种传递参数的方法,一种是您正在使用的方法.但是,Resharper无从得知这一点.方法用StringFormatMethod属性和Resharper 修饰,再次正确,假设它总是像这样使用.
所以这个问题不在Resharper方面,而是在EF Core方面,因为混合不同的传递参数的方式,然后用属性强制Resharper认为只有一个是有效的装饰方法不是一个好主意.那时最好不要标记它.
要解决方法,您可以使用"字符串格式"方式传递参数,如上所示,但这当然并不总是令人满意.您可以通过将查询移动到单独的变量或执行以下操作来阻止Resharper分析此表达式:
FromSql(new RawSqlString("get_children_fluxo_closure @node_id"), new SqlParameter("@node_id", 1)).ToList();
Run Code Online (Sandbox Code Playgroud)
或者通过评论禁用警告:
// ReSharper disable once FormatStringProblem
FromSql("get_children_fluxo_closure @node_id", new SqlParameter("@node_id", 1)).ToList();
Run Code Online (Sandbox Code Playgroud)
但这一切都很难看.Real Soltuion在EF Core github跟踪器上打开了一个问题并要求他们修复它.