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
, Guid
o 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());