参数化原始 SQL 更新在 EF Core 中不起作用

Parameterized Raw SQL Update not working in EF Core

我正在尝试参数化我正在使用 Entity Framework Core 6 执行的 SQL 语句。参数没有按预期工作。我希望所有这些语句都能起作用,但它们不起作用:

await _context.Database.ExecuteSqlInterpolatedAsync(
            $@"UPDATE Schema.Table 
                SET  {columnName}={Convert.ToByte(value)} 
                WHERE Id = {id}");

await _context.Database.ExecuteSqlRawAsync(
            @"UPDATE Schema.Table 
                SET  {0}={1} 
                WHERE Id= {2}", columnName, Convert.ToByte(value), id);

var p0 = new SqlParameter("@column", columnName);
var p1 = new SqlParameter("@value", Convert.ToByte(value));
var p2 = new SqlParameter("@id", id);
await _context.Database.ExecuteSqlRawAsync(
            @"UPDATE Schema.Table 
                SET  @column=@value 
                WHERE Id = @id", p0, p1, p2);

我确实让它可以处理这两个查询,但它们没有正确参数化:

await _context.Database.ExecuteSqlRawAsync(
            $@"UPDATE Schema.Table
                SET  {columnName}={{0}} 
                WHERE Id = {{1}}", Convert.ToByte(value), id);

var cmdUpdate = $"UPDATE Schema.Table " +
                $"SET  {columnName}={Convert.ToByte(value)} " +
                $"WHERE Id = {id}";
            await _context.Database.ExecuteSqlRawAsync(cmdUpdate);

问题似乎与参数化列名有关,但我找不到任何表明我不能这样做的内容。有没有办法参数化列名?

我以前做过这样的事情
试试这个:

 _context.Database.ExecuteSqlCommand(
                $"update schema.table 
                set columnName= :value1 
                where columnName= :value2 and columnName is null", value1, value2);

I can not find anything that says I can't do this

但是您找不到任何可以可以的东西。这一事实以及您自己的测试向我们表明这是不允许的。与Entity Framework无关;这是 SQL 服务器的限制。 Entity Framework 使用 sp_executesql to execute queries with parameters, and parameters just won't work for column or table names. You're certainly not the first to ask.

如您所见,您可以使用 C# 字符串插值,但要小心。如果您的 columnName 变量是从用户输入中获取的,它会让您面临 SQL 注入。所以在执行查询之前确保它是一个真实的列名。