Compartir a través de


Limitaciones de Dapper

Hay algunas limitaciones que debe tener en cuenta al usar Microsoft.Data.Sqlite con Dapper.

Parámetros

Los nombres de parámetros de SQLite distinguen mayúsculas de minúsculas. Asegúrese de que los nombres de parámetro usados en SQL coincidan con el caso de las propiedades del objeto anónimo. El problema n.º 18861 mejoraría esta experiencia.

Dapper también espera que los parámetros usen el @ prefijo. Otros prefijos no funcionarán.

var result = connection.ExecuteScalar(
    "SELECT @Value",
    new { Value = 1 });

Tipos de datos

Dapper lee valores mediante el indexador SqliteDataReader. El tipo de valor devuelto de este indexador es object, lo que significa que solo devolverá valores long, double, string o byte[]. Para obtener más información, vea Tipos de datos. Dapper controla la mayoría de las conversiones entre estos y otros tipos primitivos. Desafortunadamente, no controla DateTimeOffset, Guid o TimeSpan. Cree controladores de tipos si desea usar estos tipos en los resultados.

abstract class SqliteTypeHandler<T> : SqlMapper.TypeHandler<T>
{
    // Parameters are converted by Microsoft.Data.Sqlite
    public override void SetValue(IDbDataParameter parameter, T? value)
        => parameter.Value = value;
}

class DateTimeOffsetHandler : SqliteTypeHandler<DateTimeOffset>
{
    public override DateTimeOffset Parse(object value)
        => DateTimeOffset.Parse((string)value);
}

class GuidHandler : SqliteTypeHandler<Guid>
{
    public override Guid Parse(object value)
        => Guid.Parse((string)value);
}

class TimeSpanHandler : SqliteTypeHandler<TimeSpan>
{
    public override TimeSpan Parse(object value)
        => TimeSpan.Parse((string)value);
}

No olvide agregar los controladores de tipos antes de realizar consultas.

SqlMapper.AddTypeHandler(new DateTimeOffsetHandler());
SqlMapper.AddTypeHandler(new GuidHandler());
SqlMapper.AddTypeHandler(new TimeSpanHandler());

Consulte también