Compartilhar via


Limitações do Dapper

Há algumas limitações de que você deve estar ciente ao usar o Microsoft.Data.Sqlite com o Dapper.

Parâmetros

Os nomes de parâmetro SQLite diferenciam maiúsculas de minúsculas. Verifique se os nomes de parâmetro usados no SQL correspondem às maiúsculas e minúsculas das propriedades do objeto anônimo. O problema nº 18861 melhoraria essa experiência.

O Dapper também espera que os parâmetros usem o prefixo @. Outros prefixos não funcionarão.

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

Tipos de dados

O Dapper lê valores usando o indexador SqliteDataReader. O tipo retornado desse indexador é objeto, o que significa que ele só retornará valores longos, duplos, de cadeia de caracteres ou de byte[]. Para mais informações, confira Tipos de Dados. O Dapper lida com a maioria das conversões entre esses e outros tipos primitivos. Infelizmente, ele não lida com DateTimeOffset, Guid nem TimeSpan. Crie manipuladores de tipo se quiser usar esses tipos em seus 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);
}

Não se esqueça de adicionar os manipuladores de tipo antes de consultar.

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

Confira também