使用DbSet<T>.SqlQuery()时,如何使用命名参数?

6

我非常推崇使用命名参数代替基于字符串的参数注入。这种做法具有类型安全性,可以避免大多数SQL注入攻击。在旧版的 ADO.NET 中,我会为我的查询创建一个 SqlCommand 对象和一组 SqlParameters。

var sSQL = "select * from Users where Name = @Name";
var cmd = new SqlCommand(conn, sSQL);
cmd.Parameters.AddWithValue("@Name", "Bob");
cmd.ExecuteReader();

现在,在Entity Framework中,它似乎(在此链接上)又退化为简单的String.Format语句和字符串注入:(为了讨论而简化)
MyRepository.Users.SqlQuery("Select * from Users where Name = {0}", "Bob");

有没有一种方法可以在实体框架DbSqlQuery类中使用命名参数?
2个回答

4
var param = new ObjectParameter(":p0", "Bob");
MyRepository.Users.SqlQuery("Select * from Users where Name = :p0", param);

那个在哪里有记录?SQL主体中允许使用哪些名称格式?它不能支持“@name”样式吗? - Eric Falsken
@EricFalsken。您可以在MSDN的这里看到,支持使用@name样式。 - gdoron
这对我完全不起作用,它没有文档说明,并且你只会得到指定的参数名':p0'无效。参数名必须以字母开头,只能包含字母,数字和下划线。的错误提示。 - NibblyPig

3
由于我无法进行评论,因此我正在修复其他答案。
var param = new ObjectParameter("p0", "Bob");
MyRepository.Users.SqlQuery("Select * from Users where Name = :p0", param);

在实例化ObjectParameter时,不必在名称上加冒号。这就是为什么SLC在他的评论中提到的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接