AnsiStrings peut-il être utilisé par défaut avec Dapper?

c# dapper

Question

J'utilise Dapper sur une base de données où les chaînes sont stockées principalement dans les colonnes VarChar . Par défaut, Dapper utilise les paramètres NVarChar lors de la génération des requêtes et, bien que je puisse envelopper chaque paramètre de chaîne que j'utilise avec DbString il serait bon d'utiliser AnsiStrings par défaut et d'utiliser DbString pour le cas NVarChar .

J'ai essayé de changer le type de carte dans la source Dapper de DbType.String à DbType.AnsiString mais cela semble provoquer une erreur dans la génération IL pour les paramètres délégués (lève une InvalidProgramException ).

Y a-t-il un moyen plus facile de le faire?

Mettre à jour

Juste changer le typeMap n'était pas suffisant, j'avais besoin de modifier certaines if (dbType == DbType.String) aussi. Maintenant ça marche!

Réponse acceptée

Vous pouvez accomplir cela sans modifier le code source.

Dapper.SqlMapper.AddTypeMap(typeof(string), System.Data.DbType.AnsiString);

Le réglage de cette fois ajustera toutes vos chaînes à varchar.


Réponse populaire

Pour utiliser les réponses par défaut, je devais (en référence à la source Dapper 1.3 de NuGet):

  • Modifier la carte de type pour utiliser DbType.AnsiString sur L164 au lieu de DbType.String
  • Dans la méthode CreateParamInfoGenerator modifiez les contrôles sur L960, L968, L973 pour inclure DbType.AnsiString et DbType.String .

Le problème avec l'IL non valide semblait être que la dernière branche du code sur L1000 vérifie le typeof(string) alors que les branches précédentes utilisent DbType .

Faire en sorte que tout soit redevenu parfait - plus de scans d'index!




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