Condividi tramite


Limitazioni Dapper

È opportuno tenere presente alcune limitazioni quando si usa Microsoft.Data.Sqlite con Dapper.

Parametri

I nomi dei parametri SQLite fanno distinzione tra maiuscole e minuscole. Assicurarsi che i nomi dei parametri usati in SQL corrispondano al caso delle proprietà dell'oggetto anonimo. Il problema n. 18861 migliorerebbe questa esperienza.

Dapper prevede anche che i parametri usino il prefisso @. Altri prefissi non funzioneranno.

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

Tipo di dati

Dapper legge i valori usando l'indicizzatore SqliteDataReader. Il tipo restituito di questo indicizzatore è un oggetto, quindi restituirà solo valori long, double, string o byte[]. Per ulteriori informazioni, vedi Tipi di dati. Dapper gestisce la maggior parte delle conversioni tra questi e altri tipi primitivi. Sfortunatamente, non gestisce DateTimeOffset, Guido TimeSpan. Creare gestori di tipi se si vogliono usare questi tipi nei risultati.

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

Non dimenticare di aggiungere i gestori dei tipi prima dell'esecuzione di query.

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

Vedi anche