AnsiString默认情况下可以与Dapper一起使用吗

本文关键字:一起 Dapper 默认 情况下 AnsiString | 更新日期: 2023-09-27 17:59:28

我对一个数据库使用Dapper,其中字符串主要存储在VarChar列中。默认情况下,Dapper在生成查询时使用NVarChar参数,虽然我可以包装我在DbString中使用的每个字符串参数,但默认情况下使用AnsiStrings并在NVarChar的情况下使用DbString会很好。

我尝试将Dapper源中的类型映射从DbType.String更改为DbType.AnsiString,但这似乎会导致参数委托的IL生成出错(抛出InvalidProgramException

有更简单的方法吗?

更新

仅仅更改typeMap是不够的,我还需要更改一些if (dbType == DbType.String)检查。现在它工作了!

AnsiString默认情况下可以与Dapper一起使用吗

您可以在不修改源代码的情况下完成此操作。

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

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

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

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

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

这样做,一切又恢复了——不再进行索引扫描!