Désactiver dapper.rainbow d’utiliser l’ID lors de l’insertion

c# dapper dapper-rainbow sql

Question

J'utilise dapper.rainbow pour insérer un enregistrement dans MSSQL db. Voici mon code

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

Lorsque je lance mon application, j'obtiens l'exception ci-dessous.

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

Je pense que dapper.rainbow utilise la valeur (valeur par défaut pour int) de ma colonne d'identité lors de l'insertion. C'est ce qui cause cette exception. Ma colonne d'identité pour la table RoomTypes est incrémentée automatiquement et constitue également la clé primaire de ma table.

Maintenant, comment puis-je empêcher le dapper.rainbow d'utiliser la colonne ID lors de l'insertion.

Réponse acceptée

En regardant la méthode Dapper.Rainbow.Insert , la méthode est "muette" pour le type passé en tant que paramètre de données:

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 d'autres termes, si vous incluez l'ID en tant que propriété dans le paramètre, Dapper essaiera alors d'insérer cette valeur dans la base de données. Et comme vous l'avez vu, si IDENTITY_INSERT est défini sur Off, l'insertion échouera.

Cela signifie que vous devrez créer un nouveau type qui n'inclut pas votre propriété ID pour passer dans la méthode. Quelques idées viennent à l'esprit:

  1. Créez une classe de base sans l'ID pour RoomTypes , puis transmettez simplement la classe de base à la méthode Insert .
  2. Créez un paramètre dynamique et transmettez-le à la méthode Insert avec uniquement les propriétés à insérer dans la base de données.
  3. Remplacez la méthode Insert et supprimez le paramètre ID avant de l'envoyer au Dapper



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi