Inhabilitar dapper.rainbow de usar ID mientras inserta

c# dapper dapper-rainbow sql

Pregunta

Estoy usando dapper.rainbow para insertar un registro en MSSQL db. El siguiente es mi código

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

Cuando ejecuto mi aplicación, obtengo la siguiente excepción.

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

Creo que dapper.rainbow está utilizando el valor (valor predeterminado para int) para mi columna de identidad durante la inserción. Esto es lo que causa esta excepción. Mi columna de identidad para la tabla RoomTypes se incrementa automáticamente y también es la clave principal de mi tabla.

Ahora, ¿cómo impido que dapper.rainbow use la columna ID durante la inserción?

Respuesta aceptada

Al observar el método Dapper.Rainbow.Insert , el método es "tonto" para el tipo pasado como parámetro de datos:

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();
}

En otras palabras, si incluye el ID como propiedad en el parámetro, Dapper intentará insertar ese valor en la base de datos. Y como ha visto, si tiene IDENTITY_INSERT configurado en Off, la inserción fallará.

Esto significa que deberá crear un nuevo tipo que no incluya su propiedad de ID para pasar al método. Algunas ideas vienen a la mente:

  1. Crea una clase base sin la ID para RoomTypes y luego pasa la clase base al método Insert .
  2. Cree un parámetro dinámico y páselo al método Insert con solo las propiedades que desea insertar en la base de datos.
  3. Reemplace el método Insert y elimine el parámetro ID antes de enviarlo a Dapper


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué