Dapper Extensions - L'objet de type 'System.Int32' ne peut pas être converti en type 'System.Int16'

dapper dapper-extensions

Question

J'utilise des extensions dapper (SqlMapperExtensions.cs).

En faisant une simple insertion:

db.Insert<Student>(student);

Je reçois une exception:

Object of type 'System.Int32' cannot be converted to type 'System.Int16'.

Le type d'ID dans la base de données est SmallInt.
Le type d'ID dans le POCO est court.

Lorsque je pointe dans le bloc Catch, je peux voir que les données ont été correctement conservées à la base de données. Il semble que le problème se situe lorsque les méthodes reviennent et tente de définir le nouvel identifiant créé dans le POCO.

Lorsque je change le type d’ID dans POCO en Int , cela fonctionne.

Est-ce un bug? Qu'est-ce que je rate ?

Réponse populaire

Cela ressemble à un bug une attente. Voici la déclaration d'insertion réelle utilisée par SqlMapperExtensions (autour de la ligne 530):

var r = connection.Query("select @@IDENTITY id", transaction: transaction, commandTimeout: commandTimeout);
int id = (int)r.First().id; // (1)
if (keyProperties.Any())
        keyProperties.First().SetValue(entityToInsert, id, null); // (2)
return id;

Vous pouvez voir que l'identité est supposée être un int (voir (1) ci-dessus). Et tente ensuite de définir une propriété sur l'entité en utilisant la valeur int (voir la note (2) ci-dessus). Lorsque la propriété d'identité de votre POCO est courte, ce qui précède déclenche une exception.

modifier
Comme indiqué dans les commentaires, Dapper.Contrib prend désormais en charge l'attribut [Key] .




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