Dapper y varchars

He encontrado el siguiente comentario enLa página de inicio del proyecto Dapper .NET.

Dapper admite parámetros varchar, si está ejecutando una cláusula where en una columna varchar utilizando un parámetro, asegúrese de pasarla de esta manera:

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

En el servidor Sql es crucial utilizar el código unicode cuando se consulta unicode y ansi cuando se consulta unicode no.

Estoy evaluando a Dapper para su uso con una base de datos heredada (SQL Server 2008), con una gran cantidad de procedimientos almacenados con parámetros varchar, y estoy un poco confundido por esta restricción.

Con el código ADO.NET hecho a mano, usaría lo siguiente para la consulta anterior:

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

sin especificar si es unicode o no, ni la longitud.

¿Por qué necesito esta sintaxis detallada de DbString con Dapper, especificando la longitud de la columna, IsFixedLength e IsAnsi?

¿Por qué IsFixedLength = true para una columna varchar (esperaría que fuera cierto para una columna char o nchar)?

¿Tengo que usar DbString así para los parámetros de procedimientos almacenados?

Esperaba que Dapper hiciera mi código DAL más conciso, pero esto parece hacerlo más detallado para los parámetros varchar.

ACTUALIZAR

He investigado un poco más, para tratar de entender por qué Dapper tendría esta restricción varchar, que no parece tener en mi código hecho a mano, donde normalmente crearía un parámetro de entrada de la siguiente manera:

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

y por lo general dejar el proveedor para inferir elDbType usando sus propias reglas, a menos que yo específicamente quiera coaccionarlo.

Mirando a Dapper'sDynamicParameters clase tiene un metodoAddParameters que crea parámetros de la siguiente manera:

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;                     
}

Es decir. obliga explícitamenteIDataParameter.DbType a un valor que busca con su propio algoritmo, en lugar de dejar que el proveedor use sus propias reglas.

¿Hay alguna buena razón para esto? Me parece mal, particularmente a la luz del comentario sobre el soporte de Dapper para los parámetros varchar.

Respuestas a la pregunta(2)

Su respuesta a la pregunta