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 utilizados en SQL coinciden con las propiedades del objeto anónimo. La incidencia #18861 mejorará 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 los valores mediante el indizador 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 quiere 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 tipo antes de realizar la consulta.

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

Vea también