Отключить dapper.rainbow от использования ID при вставке

Я использую dapper.rainbow для вставки записи в БД MSSQL. Ниже мой код

int? id  = db.RoomTypes.Insert(roomType)

Когда я запускаю свое приложение, я получаю следующее исключение.

Cannot insert explicit value for identity column in table 'RoomTypes' 
when IDENTITY_INSERT is set to OFF.

Я думаю, что dapper.rainbow использует значение (значение по умолчанию для int) для моего Identity Column во время вставки. Это то, что вызывает это исключение. Моя личность столбец для таблицы RoomTypes автоматически увеличивается, и это также первичный ключ моей таблицы.

Теперь, как мне остановить dapper.rainbow от использования столбца ID во время вставки.

1 ответ

Решение

Если посмотреть на метод Dapper.Rainbow.Insert, метод "тупой" для типа, передаваемого в качестве параметра данных:

public virtual int? Insert(dynamic data)
{
    var o = (object)data;
    List<string> paramNames = GetParamNames(o);

    string cols = string.Join(",", paramNames);
    string cols_params = string.Join(",", paramNames.Select(p => "@" + p));
    var sql = "set nocount on insert " + TableName + " (" + cols + ") values (" + cols_params + ") select cast(scope_identity() as int)";

    return database.Query<int?>(sql, o).Single();
}

Другими словами, если вы включите идентификатор в качестве свойства в параметр, Dapper попытается вставить это значение в базу данных. И, как вы видели, если для IDENTITY_INSERT установлено значение Off, вставка завершится неудачно.

Это означает, что вам нужно будет создать новый тип, который не включает ваше свойство ID для передачи в метод. Несколько идей приходят на ум:

  1. Создать базовый класс без идентификатора для RoomTypes а затем просто перейти в базовый класс к Insert метод.
  2. Создайте динамический параметр и передайте его Insert метод только с теми свойствами, которые вы хотите вставить в базу данных.
  3. Переопределить Insert метод и удалите параметр ID перед отправкой Dapper
Другие вопросы по тегам