Sono appena passato da Npgsql v2.2.3 a v3.2.4.1 (ora V3.2.5) su un sistema che utilizza Dapper e SimpleCRUD - altri sviluppatori assenti su misura per la versione di quest'ultimo. Non è proprio il mio campo - stavo solo cercando di fare alcuni bit PostGIS con il supporto v3 ...
Abbiamo una versione personalizzata di DateTime che, in Npgsql v3.x, la tipizzazione più severa, ci impone di impostare NpgsqlDbType su NpgsqlTypes.NpgsqlDbType.Timestamp. Ciò avviene tramite Dapper.SqlMapper.AddTypeHandler nel codice SimpleCRUD. La versione personalizzata impone che il tipo di data e ora sia UTC.
Anche se questo funziona come previsto per gli inserimenti del database, sembra non essere chiamato quando viene utilizzata una clausola WHERE - non è sicuro se sia solo in casi isolati, o solo in una o due posizioni.
Posso vedere dai registri di Postgres che i parametri per la clausola WHERE vengono regolati per la conversione UTC / locale: parametri: $ 1 = '2017-07-27 13: 29: 51 + 01'
Tramite i breakpoint, posso anche vedere che il gestore del tipo non viene inserito per la clausola WHERE, ma è per INSERT, ecc.
DOMANDE:
Devo aspettarmi che il gestore del tipo Dapper.SqlMapper venga chiamato per i parametri della clausola WHERE?
Se non si prevede un comportamento, come posso forzare NpgsqlDbType a NpgsqlTypes.NpgsqlDbType.Timestamp quando si utilizza Dapper.SimpleCRUD?
Grazie molto
Ho aggiornato all'ultimo pacchetto NuGet di Npgsql (3.2.5) e Dapper (1.50.2). Non sono sicuro dell'origine di Dapper.SimpleCRUD, ma sarebbe iniziata la sua vita nel 2014 prima di essere considerato potenzialmente pesantemente personalizzato, quindi preferirei continuare con questo piuttosto che aggiornare e aggiungere nuovamente le personalizzazioni.
Gestito per ordinare il problema.
Ho aggiunto un gestore SqlMapper.ICustomQueryParameter (DateTimeUTCParameter) e ho chiamato questo da SimpleCRUD come parte di ConstructDynamicParameters invece di eseguire direttamente la conversione.
Alla fine, è stato un cambiamento in avanti, una volta identificato ciò che era necessario.
private static DynamicParameters ConstructDynamicParameters(Dictionary<string, object> conditionParameters)
{
var dynParms = new DynamicParameters();
foreach (var kvp in conditionParameters)
{
if (kvp.Value is DateTimeUTC)
dynParms.Add(string.Format("@{0}", kvp.Key), new DateTimeUTCParameter((DateTimeUTC)kvp.Value));
else
dynParms.Add(string.Format("@{0}", kvp.Key), kvp.Value);
}
return dynParms;
}