Можно ли использовать AnsiStrings по умолчанию с Dapper? - PullRequest
12 голосов
/ 17 июня 2011

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

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

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

Обновление

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

Ответы [ 2 ]

25 голосов
/ 09 октября 2014

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

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

Если вы установите один раз, все ваши строки будут настроены на varchar.

3 голосов
/ 20 июня 2011

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

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

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

Делая все снова хорошо - больше никаких сканирований индекса!

...