开发者

Can AnsiStrings be used by default with Dapper?

开发者 https://www.devze.com 2023-03-13 21:09 出处:网络
I\'m using Dapper against a database where strings are stored primarily in VarChar columns. By default Dapper uses NVarChar parameters when generating queries and while I can wrap each and every 开发者

I'm using Dapper against a database where strings are stored primarily in VarChar columns. By default Dapper uses NVarChar parameters when generating queries and while I can wrap each and every 开发者_C百科string parameter I use with DbString it'd be great to use AnsiStrings by default and use DbString for the NVarChar case.

I tried changing the type map in the Dapper source from DbType.String to DbType.AnsiString however that seems to cause an error in the IL generation for the parameters delegate (throws an InvalidProgramException).

Is there an easier way to do this?

Update

Just changing the typeMap was not sufficient I needed to alter some if (dbType == DbType.String) checks too. Now it works!


You can accomplish this without modifying the source code.

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

Setting this once will adjust all of your strings to varchar.


To use ansistrings by default I had to (referring to Dapper 1.3 source from NuGet):

  • Alter the type map to use DbType.AnsiString on L164 instead of DbType.String
  • In the method CreateParamInfoGenerator change the checks on L960, L968, L973 to include DbType.AnsiString as well as DbType.String.

The problem with the invalid IL seemed to be that the later branch of the code on L1000 checks for typeof(string) whereas the preceeding branches use DbType.

Doing that everything is peachy again - no more index scans!

0

精彩评论

暂无评论...
验证码 换一张
取 消