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)
检查。现在它工作了!
您可以在不修改源代码的情况下完成此操作。
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.AnsiString
和DbType.String
无效IL的问题似乎是L1000上代码的后一个分支检查typeof(string)
,而前一个分支使用DbType
。
这样做,一切又恢复了——不再进行索引扫描!