升级到EFCore 3.1后,出现了已弃用的警告:
警告 CS0618 'RelationalDatabaseFacadeExtensions.ExecuteSqlCommandAsync(DatabaseFacade, RawSqlString, params object[])'已过时:'对于使用纯字符串异步执行SQL查询,请改用ExecuteSqlRawAsync。对于使用插值字符串语法创建参数异步执行SQL查询,请改用ExecuteSqlInterpolatedAsync。'
警告 CS0618 'RelationalDatabaseFacadeExtensions.ExecuteSqlCommand(DatabaseFacade, RawSqlString, params object[])'已过时:'对于使用纯字符串执行SQL查询,请改用ExecuteSqlRaw。对于使用插值字符串语法创建参数执行SQL查询,请改用ExecuteSqlInterpolated。'
与这些警告相关的旧代码如下:
context.Database.ExecuteSqlCommand("DELETE FROM Table WHERE ID = @p0", id);
await context.Database.ExecuteSqlCommandAsync("DELETE FROM Table2 WHERE ID = @p0", id);
参考精细手册,通常SQL Server参数@somename
并未详述。实际上,我甚至不明白文档中展示在表名后打开括号的示例代码是如何有效的SQL语法:
context.Database.ExecuteSqlRaw("SELECT * FROM [dbo].[SearchBlogs]({0})", userSuppliedSearchTerm)
我没有看到文档中有定义userSuppliedSearchTerm
变量的内容或类型,我很难理解它怎么可能是一个SQL语句的一部分(string userSuppliedSearchTerm = "WHERE id = 123";
带有硬编码的值?SQL注入?)或者是一个单一的原始值(int userSuppliedSearchTerm = 123
),所以这是否意味着它是某种自定义类型,指定了数据库列名和值?EFCore如何知道要查询表中的哪个列?EFCore是否解决圆括号导致的语法错误?圆括号对于EFCore理解查询是否必须?我的问题是:鉴于我的
ExecuteSqlCommand
代码是有意义的,并且ExecuteSqlRaw
的文档很不清楚/似乎解释得很差,我们如何从这个工作代码转换过来:var id = 123;
context.Database.ExecuteSqlCommand("DELETE FROM Table WHERE ID = @p0", id);
如何使用ExecuteSqlRaw?
SomeType x = ???;
context.Database.ExecuteSqlRaw("???", x);