【发布时间】:2020-04-26 23:34:00
【问题描述】:
升级到 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);
咨询the fine manual,根本没有讨论典型的SQL Server参数@somename,事实上我什至看不到文档中的示例代码,它们显示在表名后打开括号,是有效的 SQL 语法:
context.Database.ExecuteSqlRaw("SELECT * FROM [dbo].[SearchBlogs]({0})", userSuppliedSearchTerm)
我没有看到文档在哪里定义了 userSuppliedSearchTerm 变量的内容或其类型,我正在努力看看它是如何明智地成为 SQL 的块(string userSuppliedSearchTerm = "WHERE id = 123"; 带有烘焙值? SQL 注入?)或单个原始值(int userSuppliedSearchTerm = 123),这是否意味着它是某种自定义类型,它指定了 db 列名和值? 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);
【问题讨论】:
标签: c# entity-framework-core ef-core-3.1