¿Se pueden usar Ansistrings de forma predeterminada con Dapper?
Pregunta
Estoy usando Dapper en una base de datos donde las cuerdas se almacenan principalmente en VarChar
columnas. Por defecto, Dapper usa NVarChar
parámetros al generar consultas y, mientras puedo envolver todos y cada uno de los parámetros de cadena que uso con DbString
Sería genial usar Ansistrings de forma predeterminada y usar DbString
Para el NVarChar
caso.
Intenté cambiar el mapa de tipo en la fuente de dapper desde DbType.String
a DbType.AnsiString
Sin embargo, eso parece causar un error en la generación de IL para los parámetros delegado (arroja un InvalidProgramException
).
¿Hay una manera más fácil de hacer esto?
Actualizar
Simplemente cambiar el typemap no era suficiente que necesitaba alterar algunos if (dbType == DbType.String)
cheques también. ¡Ahora funciona!
Solución
Puede lograr esto sin modificar el código fuente.
Dapper.SqlMapper.AddTypeMap(typeof(string), System.Data.DbType.AnsiString);
Configurar esto una vez ajustará todas sus cadenas a Varchar.
Otros consejos
Para usar Ansistrings de forma predeterminada tuve que (referirme a la fuente Dapper 1.3 de Nuget):
- Alterar el mapa de tipos para usar
DbType.AnsiString
en L164 en lugar deDbType.String
- En el método
CreateParamInfoGenerator
Cambie los cheques en L960, L968, L973 para incluirDbType.AnsiString
tanto comoDbType.String
.
El problema con la IL inválida parecía ser que la rama posterior del código en L1000 verifica para typeof(string)
mientras que las ramas precediadas se usan DbType
.
Hacer eso todo es melocotón nuevamente, ¡no más escaneos de índice!