Ich habe gerade von Npgsql v2.2.3 zu v3.2.4.1 (jetzt V3.2.5) auf einem System aktualisiert, das Dapper und SimpleCRUD verwendet - andere abwesende Entwickler kundengebundene Version von letzterem. Es ist nicht wirklich mein Bereich - ich habe nur versucht, einige PostGIS-Bits mit der v3-Unterstützung zu tun ...
Wir haben eine benutzerdefinierte Version von DateTime, die unter Npgsql v3.x strikteres Schreiben erfordert, dass wir den NpgsqlDbType auf NpgsqlTypes.NpgsqlDbType.Timestamp setzen. Dies geschieht über einen Dapper.SqlMapper.AddTypeHandler im SimpleCRUD-Code. Die benutzerdefinierte Version erzwingt die Datumszeit als UTC.
Während dies erwartungsgemäß für Datenbankeinfügungen funktioniert, scheint es nicht aufgerufen zu werden, wenn eine WHERE-Klausel verwendet wird - nicht sicher, ob es nur in vereinzelten Fällen oder nur an ein oder zwei Stellen ist.
Ich kann aus den Postgres-Protokollen sehen, dass die Parameter für die WHERE-Klausel für die UTC / lokale Konvertierung angepasst werden: Parameter: $ 1 = '2017-07-27 13: 29: 51 + 01'
Über Haltepunkte kann ich auch sehen, dass der Typ-Handler nicht für die WHERE-Klausel eingegeben wird, sondern für INSERT usw.
FRAGEN:
Sollte ich erwarten, dass der Dapper.SqlMapper-Typ-Handler für WHERE-Klausel-Parameter aufgerufen wird?
Wenn es nicht erwartetes Verhalten ist, wie erzwinge ich NpgsqlDbType zu NpgsqlTypes.NpgsqlDbType.Timestamp, wenn Sie Dapper.SimpleCRUD verwenden?
Danke vielmals
Ich habe das neuste NuGet-Paket von Npgsql (3.2.5) und Dapper (1.50.2) aktualisiert. Ich bin mir nicht sicher, woher Dapper.SimpleCRUD stammt, aber es hätte 2014 ins Leben gerufen, bevor es scheinbar stark personalisiert wurde, also würde ich eher damit fortfahren, anstatt die Anpassungen zu aktualisieren und hinzuzufügen.
Wurde verwaltet, um das Problem zu sortieren.
Ich habe einen SqlMapper.ICustomQueryParameter-Handler (DateTimeUTCParameter) hinzugefügt und diesen aus SimpleCRUD als Teil von ConstructDynamicParameters aufgerufen, anstatt die Konvertierung direkt durchzuführen.
Am Ende war es eine direkte Veränderung, sobald ich herausgefunden hatte, was gebraucht wurde.
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;
}