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.
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:
RoomTypes
, puis transmettez simplement la classe de base à la méthode Insert
. Insert
avec uniquement les propriétés à insérer dans la base de données. Insert
et supprimez le paramètre ID avant de l'envoyer au Dapper