Dapper e varchars

Eu encontrei o seguinte comentário sobrea home page do projeto Dapper .NET.

O Dapper suporta varchar params, se você estiver executando uma cláusula where em uma coluna varchar usando um parâmetro, certifique-se de passá-lo desta forma:

    Query<Thing>("select * from Thing where Name = @Name", new {Name = 
    new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });

No Sql Server, é crucial usar o unicode ao consultar unicode e ansi ao consultar não unicode

Estou avaliando o Dapper para uso com um banco de dados legado (SQL Server 2008), com muitos procedimentos armazenados com parâmetros varchar, e estou um pouco confuso com essa restrição.

Com o código ADO.NET feito à mão, usaria o seguinte para a consulta acima:

new SqlParameter("@Name", "abcde")

sem especificar se é unicode ou não, nem o comprimento.

Por que preciso dessa sintaxe detalhada de DbString com Dapper, especificando o comprimento da coluna, IsFixedLength e IsAnsi?

Por que IsFixedLength = true para uma coluna varchar (eu esperaria que fosse verdade para uma coluna char ou nchar)?

Eu tenho que usar DbString como este para parâmetros de procedimento armazenado?

Eu estava esperando Dapper para tornar meu código DAL mais conciso, mas isso parece estar tornando mais detalhado para os parâmetros varchar.

ATUALIZAR

Eu pesquisei um pouco mais, para tentar entender por que o Dapper teria essa restrição varchar, o que eu não pareço ter em meu código criado manualmente, onde eu normalmente criaria um parâmetro de entrada da seguinte maneira:

var parameter = factory.CreateParameter(); // Factory is a DbProviderFactory
parameter.Name = ...;
parameter.Value = ...;

e geralmente deixam o provedor para inferir oDbType usando suas próprias regras, a menos que eu queira especificamente coagi-lo.

Olhando para DapperDynamicParameters classe, tem um métodoAddParameters que cria parâmetros da seguinte forma:

var dbType = param.DbType; // Get dbType and value
var val = param.Value;     // from 

...
// Coerce dbType to a non-null value if val is not null !!!!!
if (dbType == null && val != null) dbType = SqlMapper.LookupDbType(val.GetType(),name);
...
var p = command.CreateParameter();
...
if (dbType != null)                     
{                         
    p.DbType = dbType.Value;                     
}

Ou seja explicitamente coageIDataParameter.DbType Para um valor, ele procura seu próprio algoritmo, em vez de deixar que o provedor use suas próprias regras.

Existe uma boa razão para isso? Parece errado para mim, particularmente à luz do comentário sobre o suporte de Dapper para parâmetros varchar.

questionAnswers(2)

yourAnswerToTheQuestion