Отключить 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 для передачи в метод. Несколько идей приходят на ум:
- Создать базовый класс без идентификатора для
RoomTypes
а затем просто перейти в базовый класс кInsert
метод. - Создайте динамический параметр и передайте его
Insert
метод только с теми свойствами, которые вы хотите вставить в базу данных. - Переопределить
Insert
метод и удалите параметр ID перед отправкойDapper