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!

¿Fue útil?

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 de DbType.String
  • En el método CreateParamInfoGenerator Cambie los cheques en L960, L968, L973 para incluir DbType.AnsiString tanto como DbType.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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top