Можно ли использовать AnsiStrings по умолчанию с помощью Dapper?

c# dapper

Вопрос

Я использую Dapper для базы данных, где строки хранятся в основном в столбцах VarChar . По умолчанию Dapper использует параметры NVarChar при генерации запросов, и, хотя я могу обернуть каждый строковый параметр, который я использую с помощью DbString было бы здорово использовать AnsiStrings по умолчанию и использовать DbString для случая NVarChar .

Я попытался изменить карту типа в источнике Dapper с DbType.String на DbType.AnsiString однако это, похоже, вызывает ошибку в DbType.AnsiString IL для делегата параметров (генерирует InvalidProgramException ).

Есть ли более простой способ сделать это?

Обновить

Просто изменить типMap было недостаточно, мне нужно было изменить некоторые, if (dbType == DbType.String) тоже проверяет. Теперь это работает!

Принятый ответ

Вы можете выполнить это без изменения исходного кода.

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

Установка этого параметра однажды отрегулирует все ваши строки на varchar.


Популярные ответы

Чтобы использовать ansistrings по умолчанию, мне пришлось (ссылаясь на источник Dapper 1.3 от NuGet):

  • Измените тип карты, чтобы использовать DbType.AnsiString на L164 вместо DbType.String
  • В методе CreateParamInfoGenerator измените проверки на L960, L968, L973, чтобы включить DbType.AnsiString а также DbType.String .

Проблема с недействительным IL, по-видимому, DbType в том, что более поздняя ветвь кода на L1000 проверяет typeof(string) тогда как предыдущие ветви используют DbType .

Делать это все снова жуткий - больше нет сканирования индексов!



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему