При обновлении до EFCore 3.1 появились устаревшие предупреждения:
Предупреждение CS0618 'RelationalDatabaseFacadeExtensions.ExecuteSqlCommandAsyn c (DatabaseFacade, RawSqlString, params object [])' устарел: 'Для асинхронной передачи c выполнение SQL запросов с использованием простых строк, вместо этого используйте ExecuteSqlRawAsyn c. Для асинхронного c выполнения SQL запросов с использованием синтаксиса интерполированной строки для создания параметров используйте вместо этого ExecuteSqlInterpolatedAsyn c. '
Warning 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 Параметры сервера @somename
вообще не обсуждаются, и на самом деле я даже не вижу, как пример кода в документах, где они показывают открытие скобок после допустимо имя таблицы SQL синтаксис:
context.Database.ExecuteSqlRaw("SELECT * FROM [dbo].[SearchBlogs]({0})", userSuppliedSearchTerm)
Я не видел, где документы определяют содержимое переменной userSuppliedSearchTerm
или ее тип, и я изо всех сил пытаюсь понять, как это может быть разумный слепок SQL (string userSuppliedSearchTerm = "WHERE id = 123";
с запеченными в значениях? SQL Injection?) или одиночное примитивное значение (int userSuppliedSearchTerm = 123
), так что это означает, что это какой-то пользовательский тип, который задает столбец db имя и значение? Как EFCore узнает, какой столбец из таблицы следует запрашивать? Разбирает ли EFCore синтаксическую ошибку, представленную в скобках? Обязательны ли для EFCore круглые скобки, чтобы понять запрос?
В конечном счете, мой вопрос: учитывая, что мой код ExecuteSqlCommand
имеет смысл, а документы для ExecuteSqlRaw
не имеют смысла / кажутся плохо объясненными, как мы go из этого рабочего кода:
var id = 123;
context.Database.ExecuteSqlCommand("DELETE FROM Table WHERE ID = @p0", id);
Для использования ExecuteSqlRaw?
SomeType x = ???;
context.Database.ExecuteSqlRaw("???", x);