Dapper - «Должен объявить скалярную переменную @VersionId» - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь использовать Dapper для выполнения некоторых простых запросов в базу данных, которая доступна на моем локальном компьютере.

Большинство запросов работают нормально, но когда я пытаюсь вставить объект в соответствующую таблицу в базе данных, я получаю SqlException.У меня есть аналогичный метод вставки, который сначала создает экземпляр объекта в теле метода и вставляет его в базу данных, и этот метод работает нормально.Но это не так.Более конкретно, это ответ от исключения:

System.Data.SqlClient.SqlException: 'Must declare the scalar variable "@VersionId".'

Вот код вызова, который генерирует исключение:

public int CreateNewSchema(Schema schema)
        {
            string sql = "INSERT INTO Schemas(VersionId, Created, Updated, SchemaData) " +
                         " values (@VersionId, @Created, @Updated, @SchemaData);";

            var affectedRows = _connection.Execute(sql, new{schema});
            return affectedRows;
        }

Соответствующая таблица схемы в моей базе данных имеет следующий дизайн.

Schema 
ID             int
VersionID      nvarchar(max)
Created        datetime2(7)
Updated        datetime2(7)
SchemaData     nvarchar(max)

И, наконец, объект POCO, который я пытаюсь вставить в эту таблицу, определяется следующим образом:

public class Schema
    {
        public int ID { get; set; }
        public string VersionId { get; set; }
        public DateTime Created { get; set; }
        public DateTime Updated { get; set; }
        public string SchemaData { get; set; }
    }

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Вы передали объект, содержащий свойство с именем schema, значением которого является объект схемы.

Dapper использует отражение, чтобы найти имена свойств и сопоставить их с параметрами в запросе.Вам не нужно создавать анонимный тип.

Анонимные типы используются для удобства, чтобы избежать создания обычного типа просто для передачи нескольких параметров.Это широко используется в Dapper, ASP.NET MVC, LINQ и везде, где необходимо передать несколько свойств, но не хочет создавать новый тип.

Просто передайте объект схемы:

var affectedRows = _connection.Execute(sql, schema);
0 голосов
/ 28 ноября 2018

Передача объекта напрямую:

var affectedRows = _connection.Execute(sql, schema);

Анализирует свойства переданного объекта.

Вы передали объект только с одним свойством schema.Так что @schema будет единственной переменной, которую вы получите в своем запросе.Если вы передадите объект как есть, а не как часть другого объекта, вы получите ожидаемые переменные, которые соответствуют Schema свойствам объекта.

...