Cómo deserializar DbString con Dapper

c# converter dapper string

Pregunta

Cuando intento deserializar un registro que contiene una cadena representada por DbString :

class Record 
{
  public DbString Text {get; set;}
}

Me sale un error

{"Invalid cast from 'System.String' to 'Dapper.DbString'."}

¿Estoy haciendo mal uso de DbString en este caso?

Respuesta aceptada

Si necesita usar DbString en el modelo de lectura (como se describe en los comentarios de mi primera respuesta), entonces tiene la opción de incluir un asignador de cadena a DbString, por ejemplo. define la clase

public class DbStringTypeHandler : SqlMapper.TypeHandler<DbString>
{
    public override DbString Parse(object value)
    {
        if (value == null)
            return null;
        var dbStringValue = value as DbString;
        if (dbStringValue != null)
            return dbStringValue;
        var stringValue = value as string;
        if (stringValue != null)
            return new DbString { Value = stringValue };
        throw new InvalidCastException("Invalid cast from '" + value.GetType() + "' to '" + typeof(DbString) + "'.");
    }

    public override void SetValue(IDbDataParameter parameter, DbString value)
    {
        parameter.Value = value;
    }
}

y luego llamar

SqlMapper.AddTypeHandler<DbString>(new DbStringTypeHandler());

antes de realizar cualquier consulta.

Ahora la clase "Grabar" debería comportarse bien como modelo de lectura y para "escribir" (es decir, establecer parámetros).

Probé esto con una conexión de servidor SQL, creo que es la clase "SqlMapper" a la que tienes que llamar "AddTypeHandler" independientemente de la base de datos con la que estés hablando, pero existe la posibilidad de que necesites ajustar esto ligeramente dependiendo sobre el proveedor.


Respuesta popular

La idea de Dapper es traducir los resultados de las consultas en clases .net estándar.

El tipo "DbString" es una clase Dapper que se utiliza para especificar valores de parámetros de una manera particular, no es algo "estándar .net".

Por lo tanto, en lugar de tratar de adivinar a qué tipos debe apuntar Dapper, debe comenzar con el caso más simple ya que con frecuencia Dapper simplemente funciona.

En su caso, su registro debería ser simplemente

class Record 
{
    public string Text { get; set; }
}

Dapper hará un buen trabajo para asegurarse de que se manejan las conversiones de tipo sensible; por ejemplo, si el campo de su base de datos es un int, con mucho gusto lo correlacionará con una propiedad int en el tipo C # o una larga o corta o un byte (aunque corre el riesgo de una excepción de desbordamiento en el tiempo de ejecución si lo baja a un tipo de datos más pequeño). En resumen, Dapper es bueno con usted y trata de hacer el arduo trabajo de mapeo tipográfico: generalmente puede apegarse a lo básico (cadena, en lugar de preocuparse por tal vez usar DbString) y ¡Dapper lo resolverá!



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué