可以使用Dapper默认使用AnsiStrings吗?

时间:2011-06-17 12:57:35

标签: c# dapper

我在数据库中使用Dapper,其中字符串主要存储在VarChar列中。默认情况下,Dapper在生成查询时使用NVarChar参数,而我可以将我使用的每个字符串参数包装为DbString,默认情况下使用AnsiStrings并使用DbString NVarChar案例。

我尝试将Dapper源中的类型映射从DbType.String更改为DbType.AnsiString但是这似乎导致参数委托的IL生成错误(抛出{{1} })。

有更简单的方法吗?

更新

仅仅改变typeMap是不够的我还需要改变一些InvalidProgramException检查。现在它有效!

2 个答案:

答案 0 :(得分:23)

您无需修改​​源代码即可完成此操作。

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

设置一次会将所有字符串调整为varchar。

答案 1 :(得分:3)

默认使用ansistrings我必须(参考NuGet的Dapper 1.3源代码):

  • 更改类型地图以在L164上使用DbType.AnsiString而不是DbType.String
  • 在方法CreateParamInfoGenerator中,将L960,L968,L973上的检查更改为包括DbType.AnsiString以及DbType.String

无效IL的问题似乎是L1000上的代码的后一分支检查typeof(string),而前面的分支使用DbType

再做一切都很好 - 不再进行索引扫描!