我正在使用Dapper對數據庫,其中字符串主要存儲在VarChar
列中。默認情況下,Dapper在生成查詢時使用NVarChar
參數,雖然我可以將我使用的每個字符串參數包裝在DbString
但默認情況下使用AnsiStrings並使用DbString
作為NVarChar
案例NVarChar
。
我嘗試將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源代碼):
DbType.AnsiString
的L164而不是DbType.String
CreateParamInfoGenerator
將L960,L968,L973上的檢查更改為包括DbType.AnsiString
以及DbType.String
。 無效IL的問題似乎是L1000上的代碼的後一分支檢查typeof(string)
而前面的分支使用DbType
。
做到這一切再次變得很好 - 沒有更多的索引掃描!