¿Se puede usar AnsiStrings por defecto con Dapper?

c# dapper

Pregunta

Estoy usando Dapper contra una base de datos donde las cadenas se almacenan principalmente en columnas VarChar . De forma predeterminada, Dapper usa los parámetros de NVarChar al generar consultas y, si bien puedo ajustar todos y cada uno de los parámetros de cadena que uso con DbString , sería genial usar AnsiStrings por defecto y usar DbString para el caso de NVarChar .

Traté de cambiar el mapa de tipos en la fuente de Dapper de DbType.String a DbType.AnsiString sin embargo, que parece causar un error en la generación de IL para los parámetros delegar (arroja una InvalidProgramException ).

¿Hay alguna forma más fácil de hacer esto?

Actualizar

Simplemente cambiar el tipo de mapa no era suficiente. Necesitaba modificar algunas if (dbType == DbType.String) también. ¡Ahora funciona!

Respuesta aceptada

Puede lograr esto sin modificar el código fuente.

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

Establecer esto una vez ajustará todas sus cadenas a varchar.


Respuesta popular

Para usar ansistrings por defecto tuve que (refiriéndome a la fuente Dapper 1.3 de NuGet):

  • DbType.AnsiString el mapa de tipos para usar DbType.AnsiString en L164 en lugar de DbType.String
  • En el método CreateParamInfoGenerator cambie las comprobaciones en L960, L968, L973 para incluir DbType.AnsiString y DbType.String .

El problema con la IL no válida parecía ser que la rama posterior del código en L1000 busca typeof(string) mientras que las ramas anteriores usan DbType .

Haciendo eso, todo vuelve a ser color de rosa: ¡no más escaneos de índice!



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow